我目前正在使用Numpy数组将C ++程序移植到Python。如果可能,我正在寻找一种以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;
}
}
上面,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;
}
}
1如何低效的依赖于编译器可以如何做到摸清循环。有一天,也许某些编译器可能会从您的代码和我的代码中生成相同的代码
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句