在python中为嵌入式for循环导入索引相关函数

时间:2014-03-17 16:26:01

标签: python c++ arrays numpy

我目前正在使用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数组的特定区域上进行操作,但这让我遇到了如何在数组中映射上述索引相关函数的问题。

1 个答案:

答案 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 效率低如何取决于编译器在计算循环方面的表现。有一天,某些编译器可能会生成与您和我的相同的代码