2016-11-21 17 views
1

トリプル形式データ(行、列およびデータ配列)から疎行列を作成するには、デフォルトの振る舞いですべての重複のデータ値を合計します。上書きする(または何もしない)ようにこの動作を変更することはできますか?例えばscipyで疎行列を作成するときに重複トリプレットの代わりに上書きする

ここ
import scipy.sparse as sparse 

rows = [0, 0] 
cols = [0, 0] 
data = [1, 1] 
S = sparse.coo_matrix((data, (rows, cols))) 

S.todense()matrix([[2]])に等しいですが、私はそれがmatrix([[1]])になりたいです。 documentation of sparse.coo_matrix

CSR又はCSCのフォーマットに変換するとき、それは エントリが加算される(i、j)を複製し、デフォルトで

を読み出します。これにより、効率的な有限要素行列等の構築が容易になる。

デフォルトから他の選択肢があるかもしれないとの議論があります。

答えて

0

私はscipy githubについて、この合計をより詳細に制御することについて議論しましたが、生産上の変更はわかりません。ドキュメントに示されているように、重複したものを合計することについての長い伝統があります。

作成したように、coo行列は合計されません。

In [697]: S = sparse.coo_matrix((data, (rows, cols))) 
In [698]: S.data 
Out[698]: array([1, 1]) 
In [699]: S.row 
Out[699]: array([0, 0], dtype=int32) 
In [700]: S.col 
Out[700]: array([0, 0], dtype=int32) 

が密への変換(またはCSR/CSCに)の合計を行います - しかし、S自体は変更されません:それはちょうど、その属性にパラメータを割り当て

In [701]: S.A 
Out[701]: array([[2]]) 
In [702]: S.data 
Out[702]: array([1, 1]) 

あなたは合算インプレースを実行することができますwith:

In [703]: S.sum_duplicates() 
In [704]: S.data 
Out[704]: array([2], dtype=int32) 

重複を削除するか、その操作をバイパスする方法はわかりません。私は関連する問題を調べるかもしれません。

=================

S.todok()(つまり、Sを変更)インプレース和を行います。そのコードを見ると、self.sum_duplicatesが呼び出されます。

In [727]: dok=sparse.dok_matrix((S.shape),dtype=S.dtype) 
In [728]: dok.update(zip(zip(S.row,S.col),S.data)) 
In [729]: dok 
Out[729]: 
<1x1 sparse matrix of type '<class 'numpy.int32'>' 
    with 1 stored elements in Dictionary Of Keys format> 
In [730]: print(dok) 
    (0, 0) 1 
In [731]: S 
Out[731]: 
<1x1 sparse matrix of type '<class 'numpy.int32'>' 
    with 2 stored elements in COOrdinate format> 
In [732]: dok.A 
Out[732]: array([[1]]) 

それは辞書の更新ですので、最終的な値は、重複の最後である:以下は合計せずにいることを複製します。 dok.updateは、スパース行列に値を追加するかなり高速な方法だと私は他のところで見出しました。

tocsrは本質的に合計を行います。 toliltocsrを使用します。したがって、この​​のアプローチは最も簡単かもしれません。

関連する問題