【发布时间】:2019-06-05 12:15:55
【问题描述】:
我在所有网格中有一个双 for 循环,我想让它工作得更快。
r, vec1, vec2, theta 是相同长度的向量 N。 c 是一个常数。
import numpy as np
N = 30
x_coord, y_coord = 300, 300
m1 = np.zeros((x_coord, y_coord))
vec1, vec2 = np.ones(N), np.ones(N)
theta = np.ones(N)
for x in np.arange(x_coord):
for y in np.arange(y_coord):
m1[x,y] = np.sum(np.cos(2.*np.pi*(r*(vec1*x + vec2*y))+theta)) * c
两个循环的时间是:
1.03 s ± 8.96 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
我也尝试使用np.meshgrid:
def f1(x, y):
sum1 = vec1*x + vec2*y
mltpl1 = r * sum1
sum2 = 2.*np.pi * mltpl1 + theta
sum3 = np.sum(np.cos(sum2))
mltpl2 = sum3 * c
return mltpl2
msh1, msh2 = np.meshgrid(range(x_coord), range(y_coord))
pairs = np.vstack((np.ravel(msh1), np.ravel(msh2))).T
m1 = np.reshape(list(map(lambda x: f1(x[0], x[1]), pairs)), (m1.shape[0], m1.shape[1])).T
尝试meshgrid时间比较多:
1.25 s ± 48.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
所以我需要一个解决方案,如何在向量和矩阵级别上做到这一点。有什么想法吗? 提前谢谢你。
【问题讨论】:
标签: python numpy vectorization