我正在测量多个点之间的欧几里德距离,并将它们的坐标存储在数组中。
from sklearn.metrics.pairwise import euclidean_distances
points = [[1,2], [1,3], [4,5], [2,6]]
distances = euclidean_distances(points)
distances
array([[0. , 1. , 4.24264069, 4.12310563],
[1. , 0. , 3.60555128, 3.16227766],
[4.24264069, 3.60555128, 0. , 2.23606798],
[4.12310563, 3.16227766, 2.23606798, 0. ]])
在返回的数组中,每个值都出现两次。有没有一种方法可以有效地返回只出现一次的值? 这将是我首选的结果:
[1.0, 4.242640687119285, 4.123105625617661, 3.605551275463989, 3.1622776601683795, 2.23606797749979]
我查看了 euclidean_distances 公式的文档,但似乎没有排除双精度值的参数。
我可以通过以下方式排除双精度值:
dist_list = []
for i in range(len(distances)):
unique_dist = distances[i][i+1:]
dist_list.extend(unique_dist)
但我想知道是否有更有效的方法。我不想使用 unique(),因为我的数据中可能存在双倍距离。
Numpy 对于提取矩阵上(或下)三角形部分的索引非常有用。我这里设置了
k=1
来排除对角线部分,如果你想包含它,使用 k=0
。
import numpy as np
from sklearn.metrics.pairwise import euclidean_distances
points = [[1,2], [1,3], [4,5], [2,6]]
distances = euclidean_distances(points)
print(distances[np.triu_indices_from(distances, k=1)])
array([1. , 4.24264069, 4.12310563, 3.60555128, 3.16227766,
2.23606798])