我有两个(scipy)CSR稀疏矩阵:
A (12414693, 235470)
B (235470, 48063)
执行如下步骤:
A.dot(B)
导致分段错误。
我做错了什么?
修改
我向scipy开发者社区提交了一个错误: https://github.com/scipy/scipy/issues/3212
答案 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)
使用您的数据,数组c
是12414693 + 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类型。