我使用Python和Scipy库来创建稀疏矩阵,特别是csr_matrix(压缩稀疏行矩阵) . 矩阵相当大,大约70000 * 70000个元素 . 我将矩阵构建为2d数组,然后构造csr_matrix,将2d数组作为参数 . 构造一个非常稀疏的大小矩阵很容易完成,没有任何问题 .
当给出更密集的2d数组(更少的零元素)时,问题就会出现,进程会因错误而中断:
值错误:无法识别的csr_matrix构造函数用法
我尝试在相同大小的交互式Python环境中构建一个密集矩阵,并得到完全相同的错误 .
from scipy import sparse
a = [[10 for i in range(70000)] for j in range(70000)]
mat = sparse.csr_matrix(a)
所以我的问题是:
-
构建csr_matrix是否取决于2d数组的稀疏程度?限制是多少?
-
如何在处理这些错误的过程中确保程序不会被中断?
-
任何替代解决方案?
提前致谢
2 回答
数字越小,您的方法就越有效:
密度不是问题 . 大小可能是 . 我无法重现您的错误,因为当我尝试更大的尺寸时,我的机器会慢慢爬行,我必须中断该过程 .
如文档中所示,
csr_matrix
需要几种输入 . 它根据元素的数量识别它们 . 我没有适合任何这些,但它可能试图把它变成一个数组 .很可能你的错误信息是某种排序内存错误的结果 - 你试图制作一个太大的矩阵 . 密集矩阵70000平方很大(至少在某些机器上),并且表示相同矩阵的稀疏矩阵将更大 . 它必须存储每个元素3次 - 一次用于值,两次用于坐标 .
这种大小的真正稀疏矩阵是有效的,因为稀疏表示要小得多,大约与非零元素数量的3倍成比例 .
在
scipy/sparse/compressed.py
我猜它尝试:
这会导致某种错误,很可能是“太大”或“记忆” . 该错误被捕获,并以此“无法识别的...”消息重新发布 .
尝试
我怀疑它会给你一个更丰富的错误信息 .
查看有关创建稀疏矩阵的最后两个示例:
http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html
您也可以在文档中找到其他问题的答案