如何将scipy行矩阵转换为numpy数组

时间:2016-07-15 21:08:04

标签: python numpy scipy

考虑以下示例:

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(:)相比。有更优雅的方式吗?

2 个答案:

答案 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的squeezereshape

轻松完成
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.])