【发布时间】:2017-06-26 11:28:37
【问题描述】:
我一直在浏览这些问题,并且可以找到一些帮助,但我更喜欢通过直接询问来确认。所以这是我的问题。
我有一个维度为 N 的 (numpy) 数组 u,我想从中构建一个维度为 N^2 的方阵 k。基本上,每个矩阵元素k(i,j) 定义为k(i,j)=exp(-|u_i-u_j|^2)。
我的第一个天真方法是这样的,我相信这类似于 Fortran:
for i in range(N):
for j in range(N):
k[i][j]=np.exp(np.sum(-(u[i]-u[j])**2))
但是,这非常慢。例如,对于 N=1000,大约需要 15 秒。 我的其他方法如下(受其他问题/答案的启发):
i, j = np.ogrid[:N,:N]
k = np.exp(np.sum(-(u[i]-u[j])**2,axis=2))
这样更快,对于 N=1000,结果几乎是瞬时的。 所以我有两个问题。
1) 为什么第一种方法这么慢,为什么第二种方法那么快?
2) 有更快的方法吗?对于 N=10000,它已经开始需要相当长的时间了,所以我真的不知道这是否是“正确”的做法。
提前谢谢你!
P.S:矩阵是对称的,所以必须有一种方法可以通过只计算矩阵的上半部分来使过程更快,但我的问题更多与操作数组的方式等有关。
【问题讨论】:
-
基本上矢量化与无矢量化。第一个示例显示了 python 循环的潜在缓慢行为。 (顺便说一句:
k[i][j]这看起来不对,如果您在这里谈论 numpy-arrays;如果它是列表列表,那么您还有一个行为缓慢的原因!)
标签: python performance numpy matrix