考虑以下示例:
import numpy as np
import scipy.sparse
A = scipy.sparse.csr_matrix((2,2))
b = A.sum(axis=0)
矩阵b
现在的格式为
matrix([[ 0., 0.]])
但是,我希望它成为这样的数组:
array([ 0., 0.])
这可以通过b = np.asarray(b)[0]
来完成,但这似乎并不优雅,特别是与MATLAB的b(:)
相比。有更优雅的方式吗?
答案 0 :(得分:3)
b.A1
将完成这项工作。
In [83]: A
Out[83]:
<2x2 sparse matrix of type '<class 'numpy.float64'>'
with 0 stored elements in Compressed Sparse Row format>
In [84]: A.A
Out[84]:
array([[ 0., 0.],
[ 0., 0.]])
In [85]: b=A.sum(axis=0)
In [86]: b
Out[86]: matrix([[ 0., 0.]])
In [87]: b.A1
Out[87]: array([ 0., 0.])
In [88]: A.A.sum(axis=0) # another way
Out[88]: array([ 0., 0.])
您可以对此进行投票,或在此处添加我最常见的答案:Numpy matrix to array :)
A
是一个稀疏矩阵。使用矩阵乘积(1s的适当矩阵)执行稀疏和。结果是一个密集的矩阵。
稀疏矩阵采用toarray()
方法,.A
快捷方式。
密集矩阵也有那些,但它也有一个.A1
(记录很少 - 因此我所有的命中),也会变平。
A1
的文档:
Return `self` as a flattened `ndarray`.
Equivalent to ``np.asarray(x).ravel()``
实际上代码是
return self.__array__().ravel()
====================
MATLAB b(:)
真的等同吗?
A(:) 是A的所有元素,被视为单列。
如果我读得正确,numpy
等效内容就是转置,或b.ravel().T
。形状为(2,1)。但在MATLAB中,列矩阵是最简单的矩阵形式。
In [94]: b.T
Out[94]:
matrix([[ 0.],
[ 0.]])
(我是一位老MATLAB程序员,我的备用计算机上有Octave。在一些旧的Windows磁盘上有3.5的副本。:)。
答案 1 :(得分:1)
这里有不同的选择。例如,您可以将矩阵b
转换为2D数组。然后你需要将它转换成一维数组。这可以通过NumPy的squeeze
或reshape
:
In [208]: np.asarray(b).squeeze()
Out[208]: array([ 0., 0.])
In [209]: np.asarray(b).reshape((b.size,))
Out[209]: array([ 0., 0.])
或者,您可以按照@Warren Weckesser的评论中的建议将A
转换为数组。这样就无需进一步转换b
:
In [210]: A.toarray().sum(axis=0)
Out[210]: array([ 0., 0.])