5

好的,我最近发现该scipy.spatial.distance.cdist命令可以非常快速地解决源和目标的两个向量数组之间的完整距离矩阵。请参阅:如何用 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)

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

谢谢,斯隆

4

2 回答 2

3

我想你已经自己破了大部分案子。但是,我将使用以下命令代替您的最后一行:

np.sqrt(np.sum(temp**2,0))
于 2012-12-10T18:06:42.987 回答
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 上进行了测试

于 2017-04-03T19:18:47.383 回答