Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么对稀疏矩阵求和会留下一个空维度?_Python_Scipy_Sparse Matrix - Fatal编程技术网

Python 为什么对稀疏矩阵求和会留下一个空维度?

Python 为什么对稀疏矩阵求和会留下一个空维度?,python,scipy,sparse-matrix,Python,Scipy,Sparse Matrix,对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 exp

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>
轴和生成二维列或行向量密集矩阵:

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)
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)
这与密集矩阵的行为相同,例如
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 [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)
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)维度的投诉:


我认为这是因为它是一个“矩阵”,而不是一个数组。因此你必须有两个维度。@PaulH为什么我可以将原始矩阵转换为Numpy数组,而不是从sum返回的对象?稀疏矩阵vs Numpy.matrix?你是对的,sum返回一个Numpy矩阵,所以
np.asarray(matrix.sum(axis=0))[0]
有效。这应该被视为Scipy中的一个bug吗?如果它仍然返回Numpy对象,则支持正确秩的
Numpy.ndarray
类型更合适。它与
np.matrix
一致。