首页 文章

使用Scipy在Python中使用大而密集的2d数组构建稀疏矩阵

提问于
浏览
2

我使用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 回答

  • 0

    数字越小,您的方法就越有效:

    In [20]: a=[[10 for i in range(1000)] for j in range(1000)]
    In [21]: M=sparse.csr_matrix(a)
    In [22]: M
    Out[22]: 
    <1000x1000 sparse matrix of type '<class 'numpy.int32'>'
        with 1000000 stored elements in Compressed Sparse Row format>
    

    密度不是问题 . 大小可能是 . 我无法重现您的错误,因为当我尝试更大的尺寸时,我的机器会慢慢爬行,我必须中断该过程 .

    如文档中所示, csr_matrix 需要几种输入 . 它根据元素的数量识别它们 . 我没有适合任何这些,但它可能试图把它变成一个数组 .

    a = np.array([[10 for i in range(M)] for j in range(N)])
    

    很可能你的错误信息是某种排序内存错误的结果 - 你试图制作一个太大的矩阵 . 密集矩阵70000平方很大(至少在某些机器上),并且表示相同矩阵的稀疏矩阵将更大 . 它必须存储每个元素3次 - 一次用于值,两次用于坐标 .

    这种大小的真正稀疏矩阵是有效的,因为稀疏表示要小得多,大约与非零元素数量的3倍成比例 .


    scipy/sparse/compressed.py

    class _cs_matrix(...):
        """base matrix class for compressed row and column oriented matrices"""
        def __init__(self, arg1, ...):
            <is arg1 a sparse matrix>
            <is arg1 a tuple>
           else:
                # must be dense
                try:
                    arg1 = np.asarray(arg1)
                except:
                    raise ValueError("unrecognized %s_matrix constructor usage" % self.format)
    

    我猜它尝试:

    np.asarray([[10 for i in range(70000)] for j in range(70000)])
    

    这会导致某种错误,很可能是“太大”或“记忆” . 该错误被捕获,并以此“无法识别的...”消息重新发布 .

    尝试

    A = np.array(a)
    M = sparse.csr_matrix(A)
    

    我怀疑它会给你一个更丰富的错误信息 .

  • 1

    查看有关创建稀疏矩阵的最后两个示例:
    http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html

    您也可以在文档中找到其他问题的答案

相关问题