欧几里得距离:计算点之间的距离

3

我有一个numpy的点数组:

points = rand(dim, n_points)

我希望你能:

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

最好全部使用numpy,不要使用for循环。如何实现?

2个回答

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 然后进行广播。

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接