我正在尝试使用两个lil_matrix稀疏矩阵的点积。分别为100,000 x 50,000和50,000 x 100,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。
答案 0 :(得分:3)
这是一个错误的错误信息,但“问题”很简单,就是你的结果矩阵太大(有太多的非零元素,而不是它的维度)。
Scipy使用int32
存储indptr
和indices
作为稀疏格式。这意味着你的稀疏矩阵不能有超过(大约)2 ^ 31个非零元素。也许您可以更改scipy中的代码以使用int64
或uint32
,如果这不仅仅是玩具问题。但是,使用稀疏矩阵可能不是解决这个问题的最佳解决方案吗?
编辑:这是在新的scipy版本AFIAK中解决的。
答案 1 :(得分:1)
只是添加@seberg的答案。
github.com/scipy/scipy上有两个与此相关的问题。
Issue #1833(已标记为2013年4月关闭)和Issue #442由于某些缺失的测试等原因导致一些尚未合并的拉取请求(2013年11月 - SciPy版本0.13.1)。您应该是能够将它们拉入您自己的安装并编译支持更大稀疏矩阵的版本。