我目前正在尝试使用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?
答案 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.getnnz
和a.eleminate_zeros
方法,如果您担心偷偷摸摸的零,这可能会有所帮助。
有时直接使用稀疏矩阵的数据属性很有用。访问它们比修改它们更安全。但每种稀疏格式都有不同的属性。在csr
案例中,你可以这样做:
In [306]: np.count_nonzero(a.data)
Out[306]: 8