gpt4 book ai didi

python - Python 和 numpy 中两个变量循环的列表理解

转载 作者:太空宇宙 更新时间:2023-11-04 01:34:36 27 4
gpt4 key购买 nike

我必须使用来自 matplotlib 的 contourf 从函数返回到绘图的值 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)

如何以更 pythonic 的方式完成此操作?

谢谢!

最佳答案

如果您可以将 final_potential 重写为矢量化函数,那就太理想了。一个简单的,也许是太明显的例子:

>>> 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 倍加速。 (与 X * Y 示例中的纯 numpy 操作的 100 倍或 1000 倍加速相比。)

关于python - Python 和 numpy 中两个变量循环的列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11017347/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com