【问题标题】:How to convert a scipy row matrix into a numpy array如何将 scipy 行矩阵转换为 numpy 数组
【发布时间】:2016-11-19 04:35:48
【问题描述】:

考虑以下示例:

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(:) 相比。有没有更优雅的方法来做到这一点?

【问题讨论】:

  • stackoverflow.com/questions/26576524/…;特别要注意的是,稀疏矩阵有 .toarray() 方法,您可以将其结果重塑为一维 numpy 数组。
  • MATLAB 的 b(:) - 大小是多少?还是 2d 不是吗? (:) 有点像np.ravel,除了 MATLAB 总是 2d 或更高。

标签: python numpy scipy


【解决方案1】:

这里有不同的选择。例如,您可以首先将矩阵b 转换为二维数组。然后您需要将其转换为一维数组。这可以通过 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.])

【讨论】:

    【解决方案2】:

    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 是一个稀疏矩阵。稀疏求和是用矩阵乘积(1 的适当矩阵)执行的。结果是一个密集矩阵。

    稀疏矩阵有一个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 的副本。:))。

    【讨论】:

    猜你喜欢
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2018-09-08
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多