Scipy中的稀疏矩阵的编码方式

import numpy as np
from scipy import sparse

(1)COO( Coordinate)

最直观的就是COO格式。它用了1维的数组来表示2维的矩阵,每个数组的长度与稀疏矩阵A的非零数字个数一样,它们的组合(i,j)组成了非零数字在稀疏矩阵中的坐标。

  • row,col数组,组合起来指明非零数字在稀疏矩阵中的坐标/定位。
  • data数组,指定了非零数字是哪些
s=np.array([[4,0,3],
           [0,32,0]]);s
array([[ 4,  0,  3],
       [ 0, 32,  0]])

为表示 s,我们这样做:

data=np.array([4,3,32])
row=np.array([0,0,1])
col=np.array([0,2,1])
s_coo=scipy.sparse.coo_matrix((data,(row,col)))

.toarray()方法返回一个numpy数组来表示稀疏矩阵,我们用这个方法来检查下s_coo是否创建对了:

s_coo.toarray()
array([[ 4,  0,  3],
       [ 0, 32,  0]])

同样我们可以用.A属性,但实际是调用了一个方法。但推荐用toarray()

(2)CSR 格式(Compressed Sparse Row)

COO格式虽然直观,但是不够精简,毕竟对于同一行/同一列的非零数字,我们重复的多用了row/column。因此,我们可以“压缩”行数,即只要表示出列数是从哪行到哪行就可以定位出非零数字的位置,而不用重复的写出来每一个非零数字的行数。这就是CSR的意思。

首先看一个COO的例子:

row=[0,1,1,1,1,2,3,4,4]
col=[2,0,1,3,4,1,0,3,4]
data=np.array([6,1,2,4,5,1,9,6,7])
ss=sparse.coo_matrix((data,(row,col)))
ss.toarray()
array([[0, 0, 6, 0, 0],
       [1, 2, 0, 4, 5],
       [0, 1, 0, 0, 0],
       [9, 0, 0, 0, 0],
       [0, 0, 0, 6, 7]])

现在用CRS格式,row换成indptr,indptr=[0,1,5,6,7,9],即表示col[0,1)在第一行,即6在第一行第2列;col[1,5)在第二行,即1,2,4,5在第二行的第0,1,3,4列,等等

indptr=[0,1,5,6,7,9]
csr=sparse.csr_matrix((data,col,indptr))
csr.toarray()
array([[0, 0, 6, 0, 0],
       [1, 2, 0, 4, 5],
       [0, 1, 0, 0, 0],
       [9, 0, 0, 0, 0],
       [0, 0, 0, 6, 7]])

(3)CSC(Compressed Sparse Column)

与CSR类似,但压缩的是列,data中的数字按列排列,不再赘述。

##### 愿你一寸一寸地攻城略地,一点一点地焕然一新 #####
原文地址:https://www.cnblogs.com/johnyang/p/14528002.html