Python 点间欧几里得距离

Python 点间欧几里得距离,python,numpy,euclidean-distance,Python,Numpy,Euclidean Distance,我有一个numpy点数组: points = rand(dim, n_points) 我想: 计算某一点和所有其他点之间的所有l2范数(欧几里德距离) 计算所有成对距离 最好是所有的numpy和no for's。如何做到这一点?这可能有助于第二部分: import numpy as np from numpy import * p=rand(3,4) # this is column-wise so each vector has length 3 sqrt(sum((p[:,np.newax

我有一个numpy点数组:

points = rand(dim, n_points)
我想:

  • 计算某一点和所有其他点之间的所有l2范数(欧几里德距离)
  • 计算所有成对距离

  • 最好是所有的numpy和no for's。如何做到这一点?

    这可能有助于第二部分:

    import numpy as np
    from numpy import *
    p=rand(3,4) # this is column-wise so each vector has length 3
    sqrt(sum((p[:,np.newaxis,:]-p[:,:,np.newaxis])**2 ,axis=0) )
    

    array([[ 0.        ,  0.37355868,  0.64896708,  1.14974483],
       [ 0.37355868,  0.        ,  0.6277216 ,  1.19625254],
       [ 0.64896708,  0.6277216 ,  0.        ,  0.77465192],
       [ 1.14974483,  1.19625254,  0.77465192,  0.        ]])
    
    如果p是

    array([[ 0.46193242,  0.11934744,  0.3836483 ,  0.84897951],
       [ 0.19102709,  0.33050367,  0.36382587,  0.96880535],
       [ 0.84963349,  0.79740414,  0.22901247,  0.09652746]])
    
    您可以通过

    sqrt(sum ((p[:,0]-p[:,2] )**2 ))
    0.64896708223796884
    
    诀窍是放置newaxis,然后进行广播


    祝你好运

    如果您愿意使用SciPy,那么
    SciPy.spatial.distance
    模块(函数
    cdist
    和/或
    pdist
    )可以完全按照您的需要执行,所有循环都是用C完成的。您也可以通过广播来执行,但会有一些额外的内存开销