阵列中所有点之间的最小欧几里德距离数组

时间:2015-06-11 16:48:13

标签: python numpy scipy distance

我有这个带有点的numpy数组,比如

[(x1,y1), (x2,y2), (x3,y3), (x4,y4), (x5,y5)]

我想做的是获得所有最小距离的数组。 因此,对于第1点(x1, y1),我想要距离它最近的点的距离,对于点2 (x2,y2)等也是如此...... 距离为sqrt((x1-x2)^2 + (y1-y2)^2)

这显然是一个与我的数组相同长度的数组(在这种情况下:5个点 - > 5个最小距离)。

任何简洁的方法,这样做而不诉诸循环?

1 个答案:

答案 0 :(得分:6)

此解决方案真正关注性能的可读性 - 它明确地计算并存储整个n x n距离矩阵,因此不能被认为是有效的。

但是:它非常简洁易读。

import numpy as np
from scipy.spatial.distance import pdist, squareform

#create n x d matrix (n=observations, d=dimensions)
A = np.array([[1,9,2,4], [1,2,3,1]]).T

# explicitly calculate the whole n x n distance matrix
dist_mat = squareform(pdist(A, metric="euclidean"))

# mask the diagonal
np.fill_diagonal(dist_mat, np.nan)

# and calculate the minimum of each row (or column)
np.nanmin(dist_mat, axis=1)