如何处理这个混合的scipy.sparse / numpy程序

时间:2016-01-17 14:23:45

标签: python numpy scipy sparse-matrix

我目前正在尝试使用numpy和scipy来处理稀疏矩阵,但是,在评估矩阵的稀疏性的过程中,我遇到了麻烦,而且我不知道以下行为应该如何要理解:

import numpy as np
import scipy.sparse as sp

a=sp.csc.csc_matrix(np.ones((3,3)))
a
np.count_nonzero(a)

使用上面的代码评估a和非零计数时,我在ipython中看到了这个输出:

  

Out [9]:< 3x3类型的稀疏矩阵'' 9   以压缩稀疏列格式存储的元素>

     

Out [10]:1

我认为这里有一些我不明白的东西。 一个3 * 3矩阵满1,应该有9个非零项,如果我使用scipy的toarray方法,这就是我得到的答案。 我可能会以错误的方式使用numpy和scipy?

1 个答案:

答案 0 :(得分:1)

非零计数可用作属性:

In [295]: a=sparse.csr_matrix(np.arange(9).reshape(3,3))
In [296]: a
Out[296]: 
<3x3 sparse matrix of type '<class 'numpy.int32'>'
    with 8 stored elements in Compressed Sparse Row format>
In [297]: a.nnz
Out[297]: 8

正如沃伦评论的那样,你不能指望在numpy上工作的sparse函数。使用sparse函数和方法。有时numpy函数是以调用数组自己的方法的方式编写的,函数调用可能在其中起作用。但这只是在个案基础上才是真实的。

Ipython中,我大量使用a.<tab>来获取完成列表(属性和方法)。我还使用function??来查看代码。

np.count_nonzero的情况下,我看不到代码 - 它是编译的,只适用于np.ndarray个对象。

np.nonzero(a)有效。查看它的代码,看看它是否找到了数组的方法:nonzero = a.nonzero

稀疏非零方法代码是:

def nonzero(self):
    ...
    # convert to COOrdinate format
    A = self.tocoo()
    nz_mask = A.data != 0
    return (A.row[nz_mask],A.col[nz_mask])

A.data !=0行是因为可以构造一个包含0个数据元素的矩阵,特别是如果您使用coo (data,(i,j))格式。因此除了谨慎之外,nnz属性提供了可靠的计数。

执行a.<tab>我还会看到a.getnnza.eleminate_zeros方法,如果您担心偷偷摸摸的零,这可能会有所帮助。

有时直接使用稀疏矩阵的数据属性很有用。访问它们比修改它们更安全。但每种稀疏格式都有不同的属性。在csr案例中,你可以这样做:

In [306]: np.count_nonzero(a.data)
Out[306]: 8