2016-11-27 9 views
1

サイトを検索した後、この問題の解決策が見つかりませんでした。そのシンプルな、私はすでに存在する疎なマトリックスを更新したいと思います。だから私はクー行列を開始したと言うことができます:scipyでオンザフライでクー・マトリックスを更新する

from scipy.sparse import coo_matrix 
import numpy as np 
row = np.array([0, 3, 1, 0]) 
col = np.array([0, 3, 1, 2]) 
data = np.array([4, 5, 7, 9]) 
a=coo_matrix((data, (row, col)), shape=(4, 4)).toarray() 
array([[4, 0, 9, 0], 
     [0, 7, 0, 0], 
     [0, 0, 0, 0], 
     [0, 0, 0, 5]]) 

ファインが、何を、私はちょうど空のまばらな配列をしたいと形状のみでそれを開始した場合、その後、値を何度も更新します。私が成功した唯一の方法は、私の古いものに新しいクオマトリックスを加えることです。

a=coo_matrix((4, 4), dtype=np.int8) 
a=a+coo_matrix((data, (row, col)), shape=(4, 4)) 
a.toarray() 
array([[4, 0, 9, 0], 
     [0, 7, 0, 0], 
     [0, 0, 0, 0], 
     [0, 0, 0, 5]]) 

そして私はこのスパースアレイを何度も更新したいと思います。しかし、これは、私が各更新のための関数を呼び出すので、かなり時間がかかります。よりよい方法が必要ですが、ドキュメントが少し明るい(少なくとも私が読んだもの)か、それを見ていないように感じます。

どうもありがとうございました

答えて

5

あなたはこのようクー行列を作るとき、それは(彼らは正しい型で提供される)行列の属性として、あなたの入力配列を使用しています。

A.colための同様
In [923]: row = np.array([0, 3, 1, 0]) 
    ...: col = np.array([0, 3, 1, 2]) 
    ...: data = np.array([4, 5, 7, 9]) 
    ...: A=sparse.coo_matrix((data, (row, col)), shape=(4, 4)) 
In [924]: A 
Out[924]: 
<4x4 sparse matrix of type '<class 'numpy.int32'>' 
    with 4 stored elements in COOrdinate format> 
In [925]: A.row 
Out[925]: array([0, 3, 1, 0]) 
In [926]: id(A.row) 
Out[926]: 3071951160 
In [927]: id(row) 
Out[927]: 3071951160 

、およびA.data

表示と計算では、多くの操作がcoo形式では定義されていないため、マトリックスはおそらくcsr形式に変換されます。

coo形式では、取得または設定のためのインデックス作成が実装されていません。

lilフォーマットは、変更が容易になるように設計されています。 csrへのインデックス付きの変更も可能ですが、警告が表示されます。

しかし、cooは、新しい行列を構築するためによく使用されます。例えば、bmat形式では、コンポーネント行列のcoo属性が新しい配列に結合され、新しい配列が新しいcoo行列を構築するために使用されます。

cooを構築するための良い方法は、インクリメンタルあなたrowcol、およびdata配列に新しい値を連結しておくことであり、その後、定期的にそれらから新しいcooを構築します。

dok形式の更新の場合: How to incrementally create an sparse matrix on python?

putting column into empty sparse matrix

creating a scipy.lil_matrix using a python generator efficiently

+1

ありがとうございました。 – Canuck

+0

私は行、col、データ配列を構築し、edでcoo行列を構築することにあなたのアドバイスを取った。ニースは問題を回避し、実際にはおそらくそれを行う最も賢明な方法です。ありがとう。 – Canuck

3

を私が最初にそれがどのインデックス、またインデックス付きの割り当てをサポートしていないためcoo_matrixは、不変であると考えました。

言われていること
from scipy.sparse import coo_matrix 
import numpy as np 
row = np.array([0, 3, 1, 0]) 
col = np.array([0, 3, 1, 2]) 
data = np.array([4, 5, 7, 9]) 

a = coo_matrix((4, 4), dtype=np.int8) 
print(a.toarray()) 

a.row = row 
a.col = col 
a.data = data 
print(a.toarray()) 

は、このアプローチのために、より適している他のまばらなフォーマットがあるかもしれません。あなたが直接あなたの空のスパース行列の基本構造を変異させることができますが判明。

+1

あなたが概説したプロセスはかなり高速です(ns)。 – Canuck

+0

@Canuckはフィードバックに感謝します。 hpauljが答えているように、 'row'、' col'、 'data'をその都度変更し、毎回' a.row 'などを再バインドせずに変更することもできます。これは、基になる配列を変更する方が簡単な場合(つまり、後でそれらを再作成しない場合)に役立ちます。 –

+1

私は 'coo'より' lil'フォーマットでこの直接セットをやっている方が少し寛大です。しかし、 'coo_matrix'クラスの' __init__'を調べて、注意すべき落とし穴があるかどうかを調べることができます(正しいタイプ、正しい形状を得る、nnzを更新するなど)。言い換えれば、 'self.data = ...'のほかに何をしますか? – hpaulj

関連する問題