gpt4 book ai didi

python - 为什么对稀疏矩阵求和会留下空维度?

转载 作者:行者123 更新时间:2023-12-01 02:23:58 25 4
gpt4 key购买 nike

当对numpy.ndarray求和时,它会减少数组的维数,除非我们设置keepdims=True。然而,这对于 Scipy 的稀疏矩阵来说似乎并非如此:

import scipy.sparse

matrix = scipy.sparse.coo_matrix([[0, 1], [2, 1]])
print(matrix.shape) # (2, 2) as expected.
print(matrix.sum().shape) # () as expected.
print(matrix.sum(axis=0).shape) # (1, 2) but expected (2,).
print(matrix.sum(axis=0)[0].shape) # (1, 2) but expected (2,).

如示例中最后一行所示,我什至无法选择结果向量。此外,尝试将总和的结果转换为密集 Numpy 数组会失败:

matrix.toarray()              # This works.
matrix.sum(axis=0).toarray() # AttributeError: 'matrix' has no 'toarray'.

如何计算稀疏矩阵沿一维的总和并获得密集数组的结果?

最佳答案

稀疏矩阵虽然是一个不同的类(类取决于格式),但尝试表现得像 np.matrix (而后者的表现又像老式的 MATLAB 矩阵)。它的形状始终是 2d,索引、求和和相关操作返回 2d。

In [172]: M = sparse.csr_matrix([[0,1],[2,1]])
In [173]: M
Out[173]:
<2x2 sparse matrix of type '<class 'numpy.int32'>'
with 3 stored elements in Compressed Sparse Row format>

总和生成标量或 0d 数组:

In [174]: M.sum()
Out[174]: 4
In [175]: _.shape
Out[175]: ()
In [176]: type(__)
Out[176]: numpy.int32

轴和产生二维列或行向量密集矩阵:

In [177]: M.sum(axis=0)
Out[177]: matrix([[2, 2]], dtype=int32)
In [178]: _.shape
Out[178]: (1, 2)
In [179]: M.sum(axis=1)
Out[179]:
matrix([[1],
[3]])
In [180]: _.shape
Out[180]: (2, 1)

这与从密集矩阵中获得的行为相同,例如M.todense()keepdims=True 为数组提供了类似的功能(来自 MATLAB 的人提示 sum 减少了维度)。

稠密矩阵有一个方便的 .A1 属性,可以将其转换为一维数组:

In [181]: M.sum(axis=1).A1
Out[181]: array([1, 3])
In [182]: M.sum(axis=0).A1
Out[182]: array([2, 2], dtype=int32)

.A 适用于稀疏矩阵和稠密矩阵,但只有稀疏矩阵有 toarray 方法(和 todense)。就像我说的,稀疏矩阵模仿稠密矩阵,但不是子类。

稀疏轴和实际上是进行矩阵乘法;稠密矩阵 * 稀疏矩阵产生稠密矩阵:

In [186]: M*np.matrix([[1],[1]])
Out[186]:
matrix([[1],
[3]], dtype=int32)
In [187]: np.matrix([[1,1]])*M
Out[187]: matrix([[2, 2]], dtype=int32)

关于数组总和没有留下这个“空”(单数是一个术语,1而不是0)维度的提示:

Why does the shape remains same when I sum a square numpy array along either directions?

关于python - 为什么对稀疏矩阵求和会留下空维度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47602925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com