CSR & CSC
https://zhuanlan.zhihu.com/p/188700729
源代码实现
https://github.com/scipy/scipy/blob/3b36a574dc657d1ca116f6e230be694f3de31afc/scipy/sparse/sparsetools/csr.h#L376
https://github.com/scipy/scipy/blob/3b36a574dc657d1ca116f6e230be694f3de31afc/scipy/sparse/sparsetools/csc.h#L111
https://github.com/scipy/scipy/blob/main/scipy/sparse/sparsetools/coo.h
https://github.com/scipy/scipy/blob/main/scipy/sparse/sparsetools/csr.h
CSR - csr_matrix¶
Compressed Sparse Row Matrix 压缩稀疏行格式¶
-
csr_matrix是按行对矩阵进行压缩的
-
通过
indices,indptr,data来确定矩阵。 -
data表示矩阵中的非零数据 -
对于第
i行而言,该行中非零元素的列索引为indices[i],第i个元素在第indices[i]列。 -
可以将
indptr理解每行的元素个数,len(indptr)=len(data) + 1。作差得到某行元素个数。 -
根据
indptr[i+1] - indptr[i],我就得到了该行中的非零元素个数,如 -
- 若
index[i] = 3且index[i+1] = 3,则第i行的没有非零元
- 若
- 、素
-
若
index[j] = 6且index[j+1] = 7,则第j行的非零元素的列索引为indices[6:7] -
得到了行索引、列索引,相应的数据存放在:
data[indptr[i]:indptr[i+1]]
'
-
对于矩阵第
0行,我们需要先得到其非零元素列索引 -
- 由
indptr[0] = 0和indptr[1] = 2可知,作差可知第0行有两个非零元素。
- 由
- 它们的列索引为
indices[0:1] = [0, 2],且存放的数据为data[0] = 8,data[1] = 2 -
因此矩阵第
0行的非零元素csr[0][0] = 8和csr[0][2] = 2 -
对于矩阵第
4行,同样我们需要先计算其非零元素列索引 -
- 由
indptr[4] = 3和indptr[5] = 6可知,第4行有3个非零元素。
- 由
- 它们的列索引为
indices[3:5cla] = [2, 3,4],且存放的数据为data[3] = 7,data[4] = 1,data[5] = 2 - 因此矩阵第
4行的非零元素csr[4][2] = 7,csr[4][3] = 1和csr[4][4] = 2
.CSC - csc_matrix¶
Compressed Sparse Column Matrix 压缩稀疏列矩阵¶
-
csc_matrix是按列对矩阵进行压缩的
-
通过
indices,indptr,data来确定矩阵,可以对比CSR -
data表示矩阵中的非零数据 -
对于第
i列而言,该行中非零元素的行索引为indices[indptr[i]:indptr[i+1]] -
可以将
indptr理解成利用其自身索引i来指向第i列元素的列索引 -
根据
[indptr[i]:indptr[i+1]],我就得到了该行中的非零元素个数,如 -
- 若
index[i] = 1且index[i+1] = 1,则第i列的没有非零元素
- 若
-
若
index[j] = 4且index[j+1] = 6,则第j列的非零元素的行索引为indices[4:6] -
得到了列索引、行索引,相应的数据存放在: data[indptr[i]:indptr[i+1]]

-
对于矩阵第
0列,我们需要先得到其非零元素行索引 -
- 由
indptr[0] = 0和indptr[1] = 1可知,第0列行有1个非零元素。
- 由
- 它们的行索引为
indices[0:1] = [0],且存放的数据为data[0] = 8 -
因此矩阵第
0行的非零元素csc[0][0] = 8 -
对于矩阵第
3列,同样我们需要先计算其非零元素行索引 -
- 由
indptr[3] = 4和indptr[4] = 6可知,第4行有2个非零元素。
- 由
- 它们的行索引为
indices[4:6] = [4, 6],且存放的数据为data[4] = 1,data[5] = 9 - 因此矩阵第
i行的非零元素csr[4][3] = 1,csr[6][3] = 9