Python和numpy中双变量循环的列表理解

Python和numpy中双变量循环的列表理解,python,list,numpy,Python,List,Numpy,我必须使用matplotlib中的contourf从函数return to plot的值x,y创建一个2D numpy数组,到目前为止,我使用的是一个类似“C”的结构,在Python中似乎效率很低: dim_x = np.linspace(self.min_x, self.max_x, self.step) dim_y = np.linspace(self.min_y, self.max_y, self.step) X, Y = np.meshgrid(dim_x, di

我必须使用matplotlib中的contourf从函数return to plot的值x,y创建一个2D numpy数组,到目前为止,我使用的是一个类似“C”的结构,在Python中似乎效率很低:

    dim_x = np.linspace(self.min_x, self.max_x, self.step)
    dim_y = np.linspace(self.min_y, self.max_y, self.step)
    X, Y = np.meshgrid(dim_x, dim_y)

    len_x = len(dim_x)
    len_y = len(dim_y)


    a = np.zeros([len_x, len_y], dtype=complex)

    for i, y in enumerate(dim_y):
        for j, x in enumerate(dim_x):
            a[i][j] = aux_functions.final_potential(complex(x, y), element_list)

cs = plt.contourf(X, Y, (a.real), 100)
如何以一种更为通灵的方式做到这一点


谢谢

我不知道这是否会提高您的性能,但有一种方法可用于构建阵列
a
。如果没有一个很好的自包含的示例,那么对其进行计时以了解性能的差异是有点棘手的。e、 g.运行辅助功能需要多长时间。最终电位?如果这个函数很昂贵,那么不管你如何优化它周围的循环


另外,我想
a[I,j]
a[I][j]
稍微有效一些,但我还没有测试过它。

如果你能将
最终势
重写为一个向量化函数,那就太理想了。一个简单的,也许是太明显的例子:

>>> dim_x = np.linspace(0, 2, 5)
>>> dim_y = np.linspace(0, 2, 5)
>>> X * Y
array([[ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ],
       [ 0.  ,  0.25,  0.5 ,  0.75,  1.  ],
       [ 0.  ,  0.5 ,  1.  ,  1.5 ,  2.  ],
       [ 0.  ,  0.75,  1.5 ,  2.25,  3.  ],
       [ 0.  ,  1.  ,  2.  ,  3.  ,  4.  ]])
但如果你真的不能做到这一点,你也可以
矢量化

>>> np.vectorize(lambda x, y: x * y + 2)(X, Y)
array([[ 2.  ,  2.  ,  2.  ,  2.  ,  2.  ],
       [ 2.  ,  2.25,  2.5 ,  2.75,  3.  ],
       [ 2.  ,  2.5 ,  3.  ,  3.5 ,  4.  ],
       [ 2.  ,  2.75,  3.5 ,  4.25,  5.  ],
       [ 2.  ,  3.  ,  4.  ,  5.  ,  6.  ]])
在您的情况下,它可能看起来像这样:

def wrapper(x, y): 
    return aux_functions.final_potential(complex(x, y), element_list)

a = np.vectorize(wrapper)(X, Y)

这可能比嵌套的
for
循环快一点,尽管python函数调用的开销会大大降低numpy的效率。在我过去做过的测试中,使用
vectorize
提供了适度的5倍加速。(这与纯numpy操作的100倍或1000倍加速相比,如
X*Y
示例中所示。)

+1用于使用fromfunction。它不会提高性能,但这不是问题,您的
final\u-potential
函数做什么?您要做的是“矢量化”该函数,而不是编写嵌套循环
fromfunction
vectorize
都可以,但它们和循环一样效率低下。你能给我指一些关于函数“矢量化”的文档吗?请通读各种
numpy
教程。(例如,另请参见)基本思想是将操作应用于整个数组,而不是单个元素。如果您能给出一个
final_potential
函数的示例,我们可以帮助您了解它。它通常非常简单,但如果您以前没有做过,它可能不会立即变得明显。在某些情况下(例如有限差分方法),它是不可能完成的,但是这是比较少见的。此外,作为一个快速的例子,考虑一个函数,它使用每个项目的<代码> Sin < /C>,如果结果大于0,则乘以2,否则只返回代码> Sin(x)。这可以写成
result=np.sin(x);result[result>0]*=2
,其中
x
是一个值数组。