2017-02-08 34 views
0

我有一個巨大的矩陣(認爲20000 x 1000)稱爲Z,我需要生成成對距離,所以我目前使用sklearn.metrics.pairwise.euclidean_distances(Z,Z)來生成成對距離。獲取X指數的最小距離列表

但是,現在我需要搜索結果來找到最小的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

scipy.spatial.distance.squareform 成對距離轉換成/從濃縮形式。一種選擇是以凝聚形式查找argmin,並將該索引映射回上三角陣列。搜索'pdist'和'squareform'的最近的scipy問題。 – hpaulj

+1

http://stackoverflow.com/q/42098093/901925; http://stackoverflow.com/q/42046359/901925 – hpaulj

回答

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

不幸的是,這並沒有爲我工作。我需要用最小的成對距離對它進行排序,然後得到那種指數。 – user1883614

+0

以上更新的答案是否有幫助? –