首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么scipy.sparse.csc_matrix.sum()的结果会将其类型改为numpy矩阵?

为什么scipy.sparse.csc_matrix.sum()的结果会将其类型改为numpy矩阵?
EN

Stack Overflow用户
提问于 2018-06-06 14:45:29
回答 2查看 1.1K关注 0票数 5

我想生成一个大型的稀疏矩阵并对其求和,但我经常遇到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更有利,因为它们无论如何都会将数据类型改回来?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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的情况下,所以您看到的结果可以归因于上面的代码块。

票数 4
EN

Stack Overflow用户

发布于 2018-06-06 16:24:05

对于本质上是一个设计选择的东西,我尽可能地给出一个确凿的理由,我会提出以下论点:

csr和csc格式是为稀疏但不是非常稀疏的矩阵设计的。特别地,对于具有明显少于N个非零的N×N矩阵,这些格式相当浪费,因为在数据和索引之上,它们携带大小为n+1的字段indptr (描绘行或列)。

因此,假设一个适当利用的csc或csr矩阵,期望行或列的和不是稀疏的是合理的,并且相应的方法应该返回密集的向量。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50713828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档