2010-03-20 210 views
3

我点的numpy的数组:欧几里得距离

points = rand(dim, n_points) 

我需要:

  1. 计算所有L2范数(欧几里得距离)的某个点和所有其他之间分数
  2. 计算所有成对距离。

并且最好是所有的numpy和no的。如何做到这一点?

回答

4

如果你愿意使用SciPy的,在scipy.spatial.distance模块(功能cdist和/或pdist)你想要什么,所有的在C.循环做,你可以用广播做到这一点,但有一些额外的内存开销。

1

这可能与第二部分帮助:

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,然后做广播。

祝你好运!