按指数

时间:2017-02-08 10:55:30

标签: python numpy scikit-learn

我有一个名为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),但我不确定它是否会适用于此实例。

1 个答案:

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