我目前正在使用Numpy数组将C ++程序移植到Python。我正在寻找一种方法,如果可能的话,以更加Pythonic的方式实现以下循环:
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;
}
}
上面,plasmaFreq_0是传递到周围函数的常量,nx也是如此。显然,很容易对循环边界进行矢量化以在numpy数组的特定区域上进行操作,但这让我遇到了如何在数组中映射上述索引相关函数的问题。
答案 0 :(得分:3)
您需要一个数组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;
}
}
1 效率低如何取决于编译器在计算循环方面的表现。有一天,某些编译器可能会生成与您和我的相同的代码