我正在尝试计算每个 vec
的所有成对距离的 sinc(vec*dist)
,其中 vec
是一维数组dist
是矩阵 coord
中行向量的成对距离。我正在使用:
dist = scipy.spatial.distance.pdist(coord)
for i in range(len(vec)):
I_avr[i] = numpy.sum(numpy.sinc(vec[i]*dist))
print vec[i], I_avr[i]
通常 coord
有 10^5 到 10^6 个向量,vec
的长度是 10^3 到 10^4。谁能推荐改进或更改以使其更快?
最佳答案
理论上,您可以将距离矩阵分成多个 block ,逐 block 进行,然后聚合,但我认为这通常不可行,因为 sum(sinc(...))
花费太多时间。让我们用一个大小为 10,000 的 block 来尝试:
>>> from scipy.spatial import distance
>>> import numpy as np
>>> np.random.seed(0)
>>> coord = np.random.random((10000, 3))
>>> dist = distance.pdist(coord)
>>> %timeit np.sum(np.sinc(dist))
1 loop, best of 3: 1.82 s per loop
这只是一个元素,没有乘法。如果 vec
的大小为 10^3
到 10^4
,则一个 10k x 10k
block 的时间将从 30 分钟到 5.5 小时不等。
现在,如果我们将 coord
的大小增加到从 10^5
到 10^6
的值,则总耗用时间将预计在 55 小时到 6.3 年之间,具体取决于输入的确切值。
关于python - 获得矩阵乘法的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36752670/