2017-02-08 11 views
0

私は現在、sklearn.metrics.pairwise.euclidean_distances(Z,Z)を使用してペアワイズ距離を生成するために、ペアワイズ距離を生成する必要があるZと呼ばれる巨大な行列(20000 x 1000と考える)を持っています。インデックスから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 が凝縮フォームからへ/ペアごとの距離を変換しようと、ソートされたインデックスを取得します。 1つのオプションは、condense形式で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)] 

を使用することができます。

EDIT:以下

idx = idx[:, np.argsort(distance)] 
+0

残念ながら、これは私のために働いていなかった。最小ペアワイズ距離でソートして、そのソートのインデックスを取得する必要があります。 – user1883614

+0

上記の更新された回答は役に立ちますか? –

関連する問題