Jan*_*Jan 3 python numpy scipy sparse-matrix python-2.7
我想生成一个大的稀疏矩阵并总结它,但我遇到MemoryError
了很多.所以我尝试通过scipy.sparse.csc_matrix.sum进行操作,但发现数据类型matrix
在获取总和后变回了numpy .
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'>
Run Code Online (Sandbox Code Playgroud)
所以我生成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
Run Code Online (Sandbox Code Playgroud)
为什么会这样?因此,总和scipy.sparse
来说,保留内存不会numpy
因为它们改变数据类型而受益吗?
只要有可能给出一个基本上是设计选择的硬理由,我就会提出以下论点:
csr和csc格式设计用于稀疏但非极稀疏的矩阵.特别是,对于具有明显少于n个非零的nxn矩阵,这些格式相当浪费,因为除了数据和索引之外,它们还带有大小为n + 1的字段indptr(描绘行或列).
因此,假设正确使用csc或csr矩阵,期望行或列和不是稀疏的并且相应的方法应返回密集向量是合理的.
我知道你的“为什么”问题主要针对设计决策背后的动机,但无论如何我追踪到了结果csc_matrix.sum(axis=1)
实际上是如何变成 numpy 的matrix
。
该类继承自基类,csc_matrix
而该类又继承自基类。最后一个实现为_cs_matrix
_data_matrix
spmatrix
.sum(ax)
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))
Run Code Online (Sandbox Code Playgroud)
换句话说,正如注释中所指出的,列/行总和是通过分别乘以密集的行或列矩阵来计算的。此操作的结果将是您在输出中看到的密集矩阵。
虽然某些子类重写了它们的.sum()
方法,但据我所知,这只发生在这种axis=None
情况下,因此您看到的结果可以归因于上面的代码块。
归档时间: |
|
查看次数: |
419 次 |
最近记录: |