scipy中通过稀疏矩阵访问元素



我在python 中有以下代码

# dense to sparse
from numpy import array
from scipy.sparse import csr_matrix
# create dense matrix
A = array([[1, 0, 0, 1, 0, 0], [0, 0, 2, 0, 0, 1], [0, 0, 0, 2, 0, 0]])
print(A)
# convert to sparse matrix (CSR method)
S = csr_matrix(A)
print(S)
# reconstruct dense matrix
B = S.todense()
print(B)

以上代码当我有以下声明时,我有

print(B[0])

我有以下输出:

[[1 0 0 1 0 0]]

我如何循环上述值,即1、0、0、1、0,0、0

In [2]: from scipy.sparse import csr_matrix
...: # create dense matrix
...: A = np.array([[1, 0, 0, 1, 0, 0], [0, 0, 2, 0, 0, 1], [0, 0, 0, 2, 0, 0]])
...: S = csr_matrix(A)
In [3]: A
Out[3]: 
array([[1, 0, 0, 1, 0, 0],
[0, 0, 2, 0, 0, 1],
[0, 0, 0, 2, 0, 0]])
In [4]: S
Out[4]: 
<3x6 sparse matrix of type '<class 'numpy.int64'>'
with 5 stored elements in Compressed Sparse Row format>

简称S.toarray()S.A,形成致密的ndarray:

In [5]: S.A
Out[5]: 
array([[1, 0, 0, 1, 0, 0],
[0, 0, 2, 0, 0, 1],
[0, 0, 0, 2, 0, 0]])

todense生成一个np.matrix对象,该对象始终2d

In [6]: S.todense()
Out[6]: 
matrix([[1, 0, 0, 1, 0, 0],
[0, 0, 2, 0, 0, 1],
[0, 0, 0, 2, 0, 0]])
In [7]: S.todense()[0]
Out[7]: matrix([[1, 0, 0, 1, 0, 0]])
In [9]: S.todense()[0][0]
Out[9]: matrix([[1, 0, 0, 1, 0, 0]])

要按"列"进行迭代,我们必须执行以下操作:

In [10]: [S.todense()[0][:,i] for i in range(3)]
Out[10]: [matrix([[1]]), matrix([[0]]), matrix([[0]])]
In [11]: [S.todense()[0][0,i] for i in range(3)]
Out[11]: [1, 0, 0]

有一种将1d行np.matrix转换为1dndarray:的快捷方式

In [12]: S.todense()[0].A1
Out[12]: array([1, 0, 0, 1, 0, 0])

从"1"中获取1d数组;行";ndarray更简单:

In [14]: S.toarray()[0]
Out[14]: array([1, 0, 0, 1, 0, 0])

np.matrix通常不受欢迎,因为它是从MATLAB过渡到更重要的时候留下的残留物。现在,sparse是在np.matrix上建模的(但不是子类化的),这是保留np.matrix的主要原因。稀疏矩阵的行和列和返回稠密矩阵。

最新更新