3

私は、約2つのlil_matrixスパース行列の内積を取得しようとしています。それぞれ100,000x50,000および50,000x100,000。

from scipy import sparse
a = sparse.lil_matrix((100000, 50000))
b = sparse.lil_matrix((50000, 100000))

c = a.dot(b)

このエラーが発生します:

 File "/usr/lib64/python2.6/site-packages/scipy/sparse/base.py", line 211, in dot
 return self * other
 File "/usr/lib64/python2.6/site-packages/scipy/sparse/base.py", line 247, in __mul__
 return self._mul_sparse_matrix(other)
 File "/usr/lib64/python2.6/site-packages/scipy/sparse/base.py", line 300, in      _mul_sparse_matrix
 return self.tocsr()._mul_sparse_matrix(other)
 File "/usr/lib64/python2.6/site-packages/scipy/sparse/compressed.py", line 290, in _mul_sparse_matrix
 indices = np.empty(nnz, dtype=np.intc)
 ValueError: negative dimensions are not allowed

何が起こっているのかについてのアイデア-これを約64GBのRAMを搭載したマシンで実行し、ドットを実行するときに約13GBを使用します。

4

2 に答える 2

3

これは悪いエラーメッセージですが、「問題」は、結果の行列が大きすぎることです(次元ではなく、ゼロ以外の要素が多すぎます)。

Scipyは、スパース形式のint32保存indptrと使用に使用します。indicesこれは、スパース行列が(およそ)2^31を超える非ゼロ要素を持つことができないことを意味します。とにかくこれが単なるトイプロブレムではない場合は、int64scipyのコードを使用するように変更することもできます。uint32しかし、スパース行列の使用は、とにかくこれを解決するための最良の解決策ではないでしょうか?

編集:これは、新しいscipyバージョンのAFIAKで解決されています。

于 2012-08-25T09:27:42.573 に答える
1

@sebergの答えに追加するだけです。

github.com/scipy/scipyには、これに関連する2つの問題があります。

いくつかのテストが欠落しているなどの理由でマージされていないいくつかのプルリクエストを含むIssue#1833(2013年4月にクローズとマーク)およびIssue#442(2013年11月-SciPyバージョン0.13.1)。これらを自分のプルリクエストにプルできるはずです。より大きなスパース行列をサポートするバージョンをインストールしてコンパイルします。

于 2013-11-22T11:58:58.593 に答える