如何在sklearn.metrics.pairwise.euclidean_distances中排除重复值
我正在测量多个点之间的欧几里得距离,这些点的坐标存储在一个数组里。
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]
我查看了欧几里得距离公式的文档,但似乎没有参数可以排除重复的值。
我可以用以下方法排除重复的值:
dist_list = []
for i in range(len(distances)):
unique_dist = distances[i][i+1:]
dist_list.extend(unique_dist)
但我在想是否有更高效的方法。我不想使用unique(),因为我的数据中可能会有重复的距离。
1 个回答
1
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])