更快的方法来获得矩阵乘法

时间:2016-04-20 18:53:18

标签: python distance

我正在尝试计算每个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。任何人都可以推荐改进或更改,以使其更快?

1 个答案:

答案 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^310^4,则一个10k x 10k块的时间将为30分钟到5.5小时。

现在,如果我们将coord的大小增加到10^510^6的值,则预计总耗用时间为55小时到6.3岁,具体取决于确切的输入值。