CSR方法采取按行压缩的办法, 将原始的矩阵用三个数组进行表示
from scipy import sparse
data = np.array([1, 2, 3, 4, 5, 6]) #所有的非零数值
indices = np.array([0, 2, 2, 0, 1, 2]) #所有值得列索引
indptr = np.array([0, 2, 3, 6]) #每行的的非零数据 data[ indptr[i]:indptr[i+1] ]
csrmatrix = sparse.csr_matrix((data,indices,indptr),shape=(3,3))
1、首先是考虑每行的非零数值,数值在data里,
data里的6个数据的索引在indptr中,indptr中每个值是每行中第一个值在data中的索引。
故矩阵第0行 data[ indptr[0]: indptr[1] ], 即data[0:2], 为数据1,2;
2、这些数值的列索引
由于已经得到矩阵中每行的非零数值,而所有的非零数值的列索引又存在indices中,则把这些数值对应的索引找出来就ok了
indptr[0], indptr[1],对应数值data[ indptr[0] ]和data[ indptr[1] ],在indices中对应的列索引为indices[ indptr[0]: indptr[1] ] 即 indices[0:2] , 为0, 2
3、对第i行
非零数值有data[ indptr[i]: indptr[i+1] ]
非零数值的列索引有indices[ indptr[i]: indptr[i+1] ]
最终即可得到第i行所有矩阵的结果。
总结:三个数组中data最好理解所有非零数值,indices值对应每一个数值的列索引,每行的值得索引在indptr中(本行的第一个数值索引开始,到下一行第一个数值开头结束),从而得到每行值的数值个数,再去indices中配对列索引,然后构造矩阵。