使用numpy或scipy计算两组向量之间欧几里德距离的最快方法

使用numpy或scipy计算两组向量之间欧几里德距离的最快方法,numpy,scipy,python-2.x,euclidean-distance,Numpy,Scipy,Python 2.x,Euclidean Distance,好的,我最近发现,scipy.spatial.distance.cdist命令对于求解源和目标的两个向量数组之间的完整距离矩阵非常快速。 见: 在求解两个大小相等的阵列之间的距离时,我想尝试复制这些性能增益。如前一链接所示,计算两个单个向量之间的距离相当直接。我们可以取向量: import numpy as np A=np.random.normal(size=(3)) B=np.random.normal(size=(3)) 然后在哪里使用“numpy.linalg.

好的,我最近发现,
scipy.spatial.distance.cdist
命令对于求解源和目标的两个向量数组之间的完整距离矩阵非常快速。 见: 在求解两个大小相等的阵列之间的距离时,我想尝试复制这些性能增益。如前一链接所示,计算两个单个向量之间的距离相当直接。我们可以取向量:

    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])对于所有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)
给我一组从
a
i
th元素到
B
i
th元素之间的42个距离。而
norm
函数正确地计算了整个矩阵的范数,给了我一个不是我想要的值。 42个距离的行为是我想要保持的,希望能以几乎与我从
cdist
获得的速度来求解完整矩阵。因此,问题是使用python和numpy/scipy计算数据与形状
(n,i)
之间的距离的最有效方法是什么

谢谢,
斯隆

我想你自己已经破获了大部分案件。但是,我将使用以下内容,而不是您的最后一行:

np.sqrt(np.sum(temp**2,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版上进行的,谢谢,我将对此进行分析,看看能给我带来多少好处,我真的希望有一种方法可以使用其中一个C库来提高性能。奇怪的是,使用
np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2)实际上快了3倍
100万个元素。这确实是一个出乎意料(令人担忧)的结果。。。!蛇以神秘的方式工作…;-)。我很感兴趣的是为什么会这样,那么你想就此发表一个新的问题,还是我要发表一个新的问题?我会让你发表,但我可以分享我在这个问题上的个人资料代码。@SoulNibbler供参考,我发表了一个关于速度问题的新问题,请参阅