我有一个名为Z的巨大矩阵(想想20000 x 1000)我需要生成成对距离,所以我现在使用sklearn.metrics.pairwise.euclidean_distances(Z,Z)
来生成成对距离。
然而,现在我需要搜索结果以找到最小的X距离,但我需要它们的索引。
一个例子是:
A = 20000 x 1000 numpy.ndarray
B = sklearn.metrics.pairwise.euclidean_distances(A, A)
C = ((2400,100), (800,900), (29,999)) if X = 3
这样做的最佳方法是什么?我看到numpy.unravel_index(a.argmax(), a.shape)
,但我不确定它是否会适用于此实例。
答案 0 :(得分:3)
您可以使用np.triu_indices
生成与压缩距离矩阵的条目对应的索引。
import numpy as np
from scipy.spatial.distance import pdist
# Generate points
Z = np.random.normal(0, 1, (1000, 3))
# Compute euclidean distance
distance = pdist(Z)
# Get the smallest distance
min_distance = np.min(distance)
# Get the indices (k = 1 to omit diagonal entries)
idx = np.asarray(np.triu_indices(len(Z), 1))
# Filter the indices (this is assuming that the minimum distance is not unique)
idx = idx[:, distance == min_distance]
如果你知道只有一个最小距离,你也可以使用
idx = idx[:, np.argmin(distance)]
效率稍高。
编辑:要获取已排序的索引,请尝试以下
idx = idx[:, np.argsort(distance)]