Python 通过索引获取X最小距离的列表

Python 通过索引获取X最小距离的列表,python,numpy,scikit-learn,Python,Numpy,Scikit Learn,我有一个巨大的矩阵(比如20000 x 1000),我需要从它生成成对距离,所以我现在使用sklearn.metrics.pairwise.euclidean_distance(Z,Z)来生成成对距离 但是,现在我需要搜索结果以找到最小的X距离,但我需要它们的索引 例如: A = 20000 x 1000 numpy.ndarray B = sklearn.metrics.pairwise.euclidean_distances(A, A) C = ((2400,100), (800,900),

我有一个巨大的矩阵(比如20000 x 1000),我需要从它生成成对距离,所以我现在使用
sklearn.metrics.pairwise.euclidean_distance(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.undravel_索引(a.argmax(),a.shape)
,但我不确定它是否适用于此实例。

您可以使用
np.triu_索引
生成与压缩距离矩阵的条目对应的索引

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

您可以使用
np.triu_索引
生成对应于压缩距离矩阵项的索引

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

scipy.space.distance.squareform将成对距离转换为压缩形式或从压缩形式转换为成对距离。一个选项是找到压缩形式的argmin,并将该索引映射回上三角数组。在最近的scipy问题中搜索
pdist
squareform
。;scipy.space.distance.squareform将成对距离转换为压缩形式或从压缩形式转换为成对距离。一个选项是找到压缩形式的argmin,并将该索引映射回上三角数组。在最近的scipy问题中搜索
pdist
squareform
。;不幸的是,这不适合我。我需要它按最小成对距离排序,然后得到这种排序的索引。不幸的是,这对我不起作用。我需要它按最小成对距离排序,然后得到这种排序的索引。