可以/不能在压缩稀疏行(CSR)矩阵上使用的numpy函数

时间:2019-03-05 18:28:02

标签: python numpy matrix diagonal

我是Python的新手,我有一个(可能非常幼稚)的问题。我有一个要处理的CSR(压缩稀疏行)矩阵(将其命名为M),看起来有些为2d numpy数组操作设计的函数可以为我的矩阵工作,而另一些则没有。 >

例如,numpy.sum(M, axis=0)运行正常,而numpy.diagonal(M)给出错误提示{ValueError}diag requires an array of at least two dimensions

那么为什么一个矩阵函数可以在M上工作而另一个却不能呢?

还有一个问题是,鉴于上述numpy.diagonal,如何从CSR矩阵中获取对角元素呢?

1 个答案:

答案 0 :(得分:1)

np.diagonal的代码是:

return asanyarray(a).diagonal(offset=offset, axis1=axis1, axis2=axis2)

也就是说,它首先尝试将参数转换为数组,例如,如果它是列表的列表。但这不是将稀疏矩阵转换为ndarray的正确方法。

In [33]: from scipy import sparse                                               
In [34]: M = sparse.csr_matrix(np.eye(3))                                       
In [35]: M                                                                      
Out[35]: 
<3x3 sparse matrix of type '<class 'numpy.float64'>'
    with 3 stored elements in Compressed Sparse Row format>
In [36]: M.A                                  # right                                  
Out[36]: 
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
In [37]: np.asanyarray(M)                    # wrong                           
Out[37]: 
array(<3x3 sparse matrix of type '<class 'numpy.float64'>'
    with 3 stored elements in Compressed Sparse Row format>, dtype=object)

正确使用np.diagonal的方法是:

In [38]: np.diagonal(M.A)                                                       
Out[38]: array([1., 1., 1.])

但是没有必要。 M已具有diagonal方法:

In [39]: M.diagonal()                                                           
Out[39]: array([1., 1., 1.])

np.sum确实有效,因为它将操作委托给了一个方法(请看其代码):

In [40]: M.sum(axis=0)                                                          
Out[40]: matrix([[1., 1., 1.]])
In [41]: np.sum(M, axis=0)                                                      
Out[41]: matrix([[1., 1., 1.]])

作为一般规则,请尝试在稀疏矩阵上使用sparse函数和方法。不要指望numpy函数正常工作。 sparse建立在numpy的基础上,但是numpy并不“了解” sparse