【问题标题】:Fastest way to Calculate the Euclidian distance between 2 sets of vectors using numpy or scipy使用 numpy 或 scipy 计算两组向量之间欧几里得距离的最快方法
【发布时间】:2012-12-10 17:28:24
【问题描述】:

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

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

谢谢, 斯隆

【问题讨论】:

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


    【解决方案1】:

    我认为您自己已经破获了大部分案件。但是,我会使用以下代码,而不是您的最后一行:

    np.sqrt(np.sum(temp**2,0))
    

    【讨论】:

    • 谢谢,我会分析一下,看看有多少收益让我受益,我真的希望有一种方法可以使用其中一个 C 库来提高性能。
    • 奇怪的是,使用 np.sqrt(temp[0]**2+temp[1]**2+temp[2]**2) 处理 100 万个元素实际上快了 3 倍。
    • 这确实是一个非常出乎意料(和令人担忧)的结果......!这条蛇以神秘的方式工作...... ;-)。我对为什么会这样很感兴趣,所以你想就此发布一个新问题,还是我应该?
    • 我会让你发布它,但我可以在这个问题上分享我的个人资料代码。
    • @SoulNibbler 仅供参考,我发布了一个关于速度问题的新问题,请参阅stackoverflow.com/questions/14566564/…
    【解决方案2】:

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

    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 上进行了测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 2014-06-14
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多