2017-06-05 18 views
1

私は行列を下位の三角形に変換する必要があるC関数に渡す必要があるscipyからの凝縮距離行列を読み込みます。たとえば:[1,2,3,4,5,6]が、私は、行によって読み取ら下三角形があるscipy凝縮距離行列を下側の行列から下側の行列に変換します。

0 
1 0 
2 4 0 
3 5 6 0 

に変換する必要があります:

0 1 2 3 
    0 4 5 
    0 6 
     0 

はこれを凝縮形式は[1,2,4,3,5,6]

私は、コンパクトな距離行列をこの形式に変換することを冗長な行列を作成せずに望んでいました。ここ

答えて

2

クイック実装の - それは、中間ステップとして正方形冗長距離行列を作成する:

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には、いくつかの答えに与えられたと基本的に同じ機能。)

+0

おかげで、私は私の行列が非常に大きいので、それを避けるために期待していた(10K - 20K行)が、で少なくともこれを使うことができます。 – GWW

+1

@GWW私の更新された回答を参照してください。 –

+0

ありがとうございました。私は早くその質問を読んで、何らかの理由で私の脳はそれをまとめませんでした。 – GWW

関連する問題