私は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
は本質的に合計を行います。 tolil
はtocsr
を使用します。したがって、こののアプローチは最も簡単かもしれません。