クイック実装の - それは、中間ステップとして正方形冗長距離行列を作成する:
In [128]: import numpy as np
In [129]: from scipy.spatial.distance import squareform
c
は、距離行列の凝縮形である:
In [130]: c = np.array([1, 2, 3, 4, 5, 6])
d
であります冗長二乗距離行列:
In [131]: d = squareform(c)
のここにあなたの凝縮しています下三角距離:
In [132]: d[np.tril_indices(d.shape[0], -1)]
Out[132]: array([1, 2, 4, 3, 5, 6])
はここで冗長な距離行列を形成することを回避する方法です。関数condensed_index(i, j, n)
は、j
>i
の行とj
>i
の冗長距離行列の列j
を受け取り、対応するインデックスを圧縮距離配列に返します。
In [169]: def condensed_index(i, j, n):
...: return n*i - i*(i+1)//2 + j - i - 1
...:
上記のように、c
は凝縮距離アレイである。
In [170]: c
Out[170]: array([1, 2, 3, 4, 5, 6])
In [171]: n = 4
In [172]: i, j = np.tril_indices(n, -1)
引数は、次の呼び出しで逆になっていることに注意してください。
In [173]: indices = condensed_index(j, i, n)
indices
は凝縮距離アレイの所望の順列を与えます。
In [174]: c[indices]
Out[174]: array([1, 2, 4, 3, 5, 6])
(condensed_index(i, j, n)
がthis questionには、いくつかの答えに与えられたと基本的に同じ機能。)
おかげで、私は私の行列が非常に大きいので、それを避けるために期待していた(10K - 20K行)が、で少なくともこれを使うことができます。 – GWW
@GWW私の更新された回答を参照してください。 –
ありがとうございました。私は早くその質問を読んで、何らかの理由で私の脳はそれをまとめませんでした。 – GWW