点之间的欧几里得距离

3 投票
2 回答
1254 浏览
提问于 2025-04-15 20:38

我有一个用numpy表示的点的数组:

points = rand(dim, n_points)

我想要做的是:

  1. 计算一个特定点和所有其他点之间的l2范数(欧几里得距离)
  2. 计算所有点之间的两两距离。

最好是只用numpy,不用for循环。该怎么做呢?

2 个回答

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

祝你好运!

4

如果你愿意使用SciPy这个库,里面的scipy.spatial.distance模块(具体来说是cdist和/或pdist这两个函数)正好能满足你的需求,而且所有的循环操作都是用C语言完成的,这样速度会更快。你也可以用广播的方式来实现,但这样会多占用一些内存。

撰写回答