csr_matrix的点积导致分段错误

时间:2014-01-13 14:31:13

标签: python numpy scipy sparse-matrix

我有两个(scipy)CSR稀疏矩阵:

A (12414693, 235470)
B (235470, 48063)

执行如下步骤:

A.dot(B)

导致分段错误。

我做错了什么?

修改

我向scipy开发者社区提交了一个错误: https://github.com/scipy/scipy/issues/3212

2 个答案:

答案 0 :(得分:4)

您的问题很可能是由{\ n} int32中存储的索引溢出引起的,这是因为您的点积具有超过2 ^ 31个非零条目的结果。请尝试以下方法......

>>> import scipy.sparse
>>> c = np.empty_like(A.indptr)
>>> scipy.sparse.sparsetools.csr_matmat_pass1(A.shape[0], B.shape[1], A.indptr,
                                              A.indices, B.indptr, B.indices, c)
>>> np.all(np.diff(c) >= 0)

使用您的数据,数组c12414693 + 1项的向量,在两个矩阵的乘积中保持每行累积的非零条目数,即它是{{{ 1}}如果C.indptr成功完成。它的类型为C = A.dot(B),即使在64位平台上也是如此。如果稀疏矩阵太大,则会出现溢出,最后一行将返回np.int32,并且用于存储矩阵产品结果的数组将以错误的大小实例化({{的最后一项) 1}},如果发生溢出,很可能是负数)。如果是这种情况,那么是的,提交错误报告......

答案 1 :(得分:2)

此链接可能会有所帮助:< http://blog.newsle.com/2013/02/01/text-classification-and-feature-hashing-sparse-matrix-vector-multiplication-in-cython/>。这些产品太大了。我不确定该文章的建议是否适用于您,但您可以尝试将第二个矩阵组织为CSC类型。