我正在尝试计算每个sinc(vec*dist)
的所有成对距离vec
,其中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。任何人都可以推荐改进或更改,以使其更快?
答案 0 :(得分:0)
理论上,你可以将你的距离矩阵分成块然后逐块进行聚合,然而我认为这通常不可行只是因为sum(sinc(...))
占用了太多时间。让我们尝试一个大小为10,000的块:
>>> 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
块的时间将为30分钟到5.5小时。
现在,如果我们将coord
的大小增加到10^5
到10^6
的值,则预计总耗用时间为55小时到6.3岁,具体取决于确切的输入值。