使用numpy或scipy计算2组向量之间的欧氏距离的最快方法

时间:2012-12-10 17:28:24

标签: numpy scipy python-2.x euclidean-distance

好的我最近发现scipy.spatial.distance.cdist命令可以非常快速地解决源和目标的两个矢量数组之间的COMPLETE距离矩阵。 见:How can the euclidean distance be calculated with numpy? 我想在解决两个相同大小的数组之间的距离时尝试复制这些性能增益。两个SINGLE向量之间的距离相当直接,可以如前一个链接所示进行计算。我们可以采取向量:

    import numpy as np
    A=np.random.normal(size=(3))
    B=np.random.normal(size=(3))

然后使用'numpy.linalg.norm'其中

    np.linalg.norm(A-B)

相当于

    temp = A-B
    np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2)

但是当我想知道两组向量之间的距离时,其中my_distance = distance_between( A[i], B[i] ) for all i第二个解决方案可以完美地工作。按照预期:

    A=np.random.normal(size=(3,42))
    B=np.random.normal(size=(3,42))     
    temp = A-B
    np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2)

给出了i A元素与i B元素之间的一组42个距离。而norm函数正确地计算整个矩阵的范数,给出一个不是我正在寻找的单个值。  42个距离的行为是我想要保持的,希望能够以cdist来解决完整矩阵的速度几乎一样快。所以问题是使用python和numpy / scipy来计算i数据之间(n,i)距离的最有效方法是什么?

谢谢, 斯隆

2 个答案:

答案 0 :(得分:3)

我认为你自己已经破解了大部分案件。但是,我会使用:

而不是你的最后一行
np.sqrt(np.sum(temp**2,0))

答案 1 :(得分:0)

以下是我认为最合适的两种方法的定时比较:

import timeit
In[19]:    timeit.timeit(stmt='np.linalg.norm(x-y,axis=0)', setup='import numpy as np; x,y = np.random.normal(size=(10, 100)), np.random.normal(size=(10, 100))', number=1000000)
Out[19]:   15.132534857024439

In[20]:    timeit.timeit(stmt='np.sqrt(np.sum((x-y),axis=1))', setup='import numpy as np; x,y = np.random.normal(size=(10, 100)), np.random.normal(size=(10, 100))', number=1000000)
Out[20]:   9.417887529009022

我对numpy方法工作得更快并不感到惊讶。我相信随着python的改进,很多这些内置函数都会得到改进。

测试是在anaconda python版本3.5.2

上进行的
相关问题