3

我试图取两个 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 内存的机器上运行它,并在执行点时使用大约 13GB。

4

2 回答 2

3

这是一个糟糕的错误消息,但“问题”很简单,就是你得到的矩阵太大(有太多的非零元素,而不是它的维度)。

Scipy 用于int32存储indptrindices用于稀疏格式。这意味着您的 sparsematrix 不能有更多(大约)2^31 个非零元素。也许您可以将 scipy 中的代码更改为使用int64or uint32,如果这不仅仅是一个玩具问题。但也许使用稀疏矩阵不是解决这个问题的最佳解决方案?

编辑:这在新的 scipy 版本 AFIAK 中得到了解决。

于 2012-08-25T09:27:42.573 回答
1

只是为了添加到@seberg 的答案。

在 github.com/scipy/scipy 上有两个与此相关的问题。

问题 #1833(标记为 2013 年 4 月关闭)和问题 #442,由于缺少一些测试等,一些拉取请求尚未合并(2013 年 11 月 - SciPy 版本 0.13.1)。您应该能够将它们拉入您自己的安装和编译支持更大稀疏矩阵的版本。

于 2013-11-22T11:58:58.593 回答