如何在sklearn.metrics.pairwise.euclidean_distances中排除重复值

0 投票
1 回答
26 浏览
提问于 2025-04-14 18:28

我正在测量多个点之间的欧几里得距离,这些点的坐标存储在一个数组里。

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])

撰写回答