在python中为索引相关函数向量化嵌套for循环 我目前正在使用NoPy数组向Python移植C++程序。我正在寻找一种方法,如果可能的话,以一种更具python风格的方式实现以下循环: for (int j = start_y; j < end_y; j++) { for (int i = start_x; i < end_x; i++) { plasmaFreq[i][j] = plasmaFreq_0*(tanh((i - 50)/10) - tanh((i - (nx - 50))/10))/2.0; } } for(int j=start_y;j

在python中为索引相关函数向量化嵌套for循环 我目前正在使用NoPy数组向Python移植C++程序。我正在寻找一种方法,如果可能的话,以一种更具python风格的方式实现以下循环: for (int j = start_y; j < end_y; j++) { for (int i = start_x; i < end_x; i++) { plasmaFreq[i][j] = plasmaFreq_0*(tanh((i - 50)/10) - tanh((i - (nx - 50))/10))/2.0; } } for(int j=start_y;j,python,c++,arrays,numpy,Python,C++,Arrays,Numpy,如上所述,plasmaFreq_0是传递到周围函数的常量,与nx一样。显然,将循环边界矢量化以在numpy数组的特定区域上进行操作很容易,但这就给我留下了如何在整个数组中映射上述索引相关函数的问题。您将需要一个数组i i = np.arange(start_x, end_x) plasmaFreq[start_x:end_x, start_y: end_y] = plasmaFreq_0 *(np.tanh((i - 50)/10) - np.tanh((i - (nx - 50))/10))/

如上所述,plasmaFreq_0是传递到周围函数的常量,与nx一样。显然,将循环边界矢量化以在numpy数组的特定区域上进行操作很容易,但这就给我留下了如何在整个数组中映射上述索引相关函数的问题。

您将需要一个数组
i

i = np.arange(start_x, end_x)
plasmaFreq[start_x:end_x, start_y: end_y] = plasmaFreq_0 *(np.tanh((i - 50)/10) - np.tanh((i - (nx - 50))/10))/2.0
我认为广播应该从那里开始


请注意,您的原始代码效率很低1。。。首先,您正在计算每个
j
的右侧,但它不依赖于
j
,因此您只需要计算一次。其次,您的内部循环超过了慢速索引,因此无法有效地使用缓存。我可能会这样写:

for (int i = start_x; i < end_x; i++)
{
    rhs = plasmaFreq_0*(tanh((i - 50)/10) - tanh((i - (nx - 50))/10))/2.0;
    for (int j = start_y; j < end_y; j++)
    {
        plasmaFreq[i][j] = rhs;
    }
}
for(inti=start\ux;i

1效率的高低取决于编译器计算循环的能力。也许有一天某些编译器可以从你和我的代码中生成相同的代码

这比直接实现循环更有效吗?@Scott——通常,但说到效率,通常最好忘记你认为你知道的东西,只需
timeit
。即使是专业人士也经常对结果感到惊讶。您对
plasmaFreq[i][j]
的计算目前没有参考
j
;对吗?对这个循环来说是对的。在程序的其他地方,它必然是一个二维数组,但在这里,我要建立一个x方向的剖面,在y方向上是恒定的。