点之间的欧几里得距离
我有一个用numpy表示的点的数组:
points = rand(dim, n_points)
我想要做的是:
- 计算一个特定点和所有其他点之间的l2范数(欧几里得距离)
- 计算所有点之间的两两距离。
最好是只用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语言完成的,这样速度会更快。你也可以用广播的方式来实现,但这样会多占用一些内存。