我想生成一个大型的稀疏矩阵并对其求和,但我经常遇到MemoryError
。因此,我尝试通过scipy.sparse.csc_matrix.sum执行此操作,但发现在求和之后,数据类型又变成了numpy matrix
。
window = 10
np.random.seed = 0
mat = sparse.csc_matrix(np.random.rand(100, 120)>0.5, dtype='d')
print type(mat)
>>> <class 'scipy.sparse.csc.csc_matrix'>
mat_head = mat[:,0:window].sum(axis=1)
print type(mat_head)
>>> <class 'numpy.matrixlib.defmatrix.matrix'>
因此,我将mat
生成为零矩阵,只是为了测试当mat_head
全为零时的结果。
mat = sparse.csc_matrix((100,120))
print type(mat)
>>> <class 'scipy.sparse.csc.csc_matrix'>
mat_head = mat.sum(axis=1)
print type(mat_head)
>>> <class 'numpy.matrixlib.defmatrix.matrix'>
print np.count_nonzero(mat_head)
>>> 0
这一切为什么要发生?因此,通过scipy.sparse
的sum在保存内存方面并不比numpy
更有利,因为它们无论如何都会将数据类型改回来?
发布于 2018-06-08 06:38:19
我知道你的“为什么”的问题主要针对设计决策背后的动机,但不管怎样,我追踪了csc_matrix.sum(axis=1)
的结果是如何变成一个麻木的matrix
的。
csc_matrix
class继承自_cs_matrix
class,_data_matrix
class继承自spmatrix
base class。最后一条implements .sum(ax)
as
if axis == 0:
# sum over columns
ret = np.asmatrix(np.ones(
(1, m), dtype=res_dtype)) * self
else:
# sum over rows
ret = self * np.asmatrix(np.ones((n, 1), dtype=res_dtype))
换句话说,as also noted in a comment,列/行和分别是通过与密集的行或列矩阵1相乘来计算的。此操作的结果将是您在输出中看到的密集矩阵。
虽然一些子类覆盖了它们的.sum()
方法,但据我所知,这只发生在axis=None
的情况下,所以您看到的结果可以归因于上面的代码块。
发布于 2018-06-06 16:24:05
对于本质上是一个设计选择的东西,我尽可能地给出一个确凿的理由,我会提出以下论点:
csr和csc格式是为稀疏但不是非常稀疏的矩阵设计的。特别地,对于具有明显少于N个非零的N×N矩阵,这些格式相当浪费,因为在数据和索引之上,它们携带大小为n+1的字段indptr (描绘行或列)。
因此,假设一个适当利用的csc或csr矩阵,期望行或列的和不是稀疏的是合理的,并且相应的方法应该返回密集的向量。
https://stackoverflow.com/questions/50713828
复制相似问题