2017-07-16 2 views
0
def get_column_normalized_matrix(A): 
    d=sp.csr_matrix.get_shape(A)[0]   
    Q=mat.zeros((d,d)) 
    V=mat.zeros((1,d)) 
    sp.csr_matrix.sum(A,axis=0,dtype='int',out=V) 
    for i in range(0,d): 
     if V[0,i]!=0: 
      Q[:,i]=sc.divide(A[:,i],V[0,i]) 
    return Q 

入力Aを配列要素を設定すると、スパースformat.Iの隣接行列は、エラーとして上記を取得しています:値エラー:配列に

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 8, in get_column_normalized_matrix 
ValueError: setting an array element with a sequence. 
+0

イメージを使用する代わりにスタックトレースをここに貼り付けることもできます。 – Grimmy

+0

'sc.divide(...)'を見てください。それは何ですか?それは 'Q [:、i]'に収まる配列ですか?密な配列でこの動作を実証すると、役立つかもしれません。 'A.A'。 – hpaulj

答えて

0

あなたが持っている問題は、あなたがしようとしているということです密な行列を稠密な行列に割り当てます。これは自動的に行われません。 .todense()を使用して、密なものにスパース行列を回すことによって、しかし、修正するために、むしろ簡単なことです:

import scipy.sparse as sp 
import numpy.matlib as mat 
import scipy as sc 

def get_column_normalized_matrix(A): 
    d=sp.csr_matrix.get_shape(A)[0] 
    Q=mat.zeros((d,d)) 
    V=mat.zeros((1,d)) 
    sp.csr_matrix.sum(A,axis=0,dtype='int',out=V) 
    for i in range(0,d): 
     if V[0,i]!=0: 
      # Explicitly turn the sparse matrix into a dense one: 
      Q[:,i]=sc.divide(A[:,i],V[0,i]).todense() 
    return Q 

あなたが代わりに出力が疎になりたい場合は、あなたは、出力行列Qがあることを確認する必要があります最初は疎です。次のようにそれを達成することができます見ることができ

def get_column_normalized_matrix(A): 
    d=sp.csr_matrix.get_shape(A)[0] 
    Q=sp.csr_matrix(A) # Create sparse output matrix 
    V=mat.zeros((1,d)) 
    sp.csr_matrix.sum(A,axis=0,dtype='int',out=V) 
    for i in range(0,d): 
     if V[0,i]!=0: 
      # Update sparse matrix 
      Q[:,i]=sc.divide(A[:,i],V[0,i]) 
    return Q 

として、QAのコピーとして作成されます。これにより、新しい要素が追加されないので、同じ要素が両方の行列でゼロでないようになり、効率的な更新が保証されます。

+0

しかし、私はQも疎な行列にして欲しいです。私は次のステップでQを疎フォーマットに再度変換すべきですか?それは非常に効率が悪く、大きな行列では遅くないでしょうか? –

+0

'Q'を密に定義しました。たとえそれがうまくいっていても、まばらな行を入れようとすると、その行はまばらになりません。 – hpaulj

+0

しかし、Qをゼロ行列に初期化しなければなりませんでした。それで疎な表記がないので、それを密な行列に初期化しなければなりませんでした。 –