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中的数字按列排列,不再赘述。