Csc_matrix与Csr_matrix的比较

Csc_matrix 与 csr_matrix

Csc_matrix 称为 Compressed Sparse Row matrix

csc_matric 全称 Compressed Sparse Column marix

两者是压缩稀疏矩阵的不同存储方式

两种矩阵的创建

两种矩阵都可以用同样的四种方式创建,除此之外又各有一种不同的方式

相同的方式

这里的csr可以替换成csc

  • csr_matrix(D) 使用稠密矩阵D创建
  • csr_matrix(S) 使用另一个稀疏矩阵创建,等同于S.tocsr()
  • csr_matrix((M, N), [dtype]),创建一个 $M \times N$ 的值全为 0 的稀疏矩阵
  • csr_matrix((data, (row_ind, col_ind)), [shape=(M, N)])
    data为存储的数,row_indcol_ind满足row_ind[k], col_ind[k] = data[k]

不同的方式

这两种不同的方式也体现了两种稀疏矩阵存储数据的差异所在

1
csr_matrix((data, indices, indptr), [shape=(M, N)])
  • data 表示存储的数据
  • i行的非零数据的位置存储在 indices[indptr[i]:indpter[i+1]],对应的数为data[indptr[i]:indpter[i+1]]

这不是特别好理解,看下图

第 0 行有 1 个数,位置为 [0,1],数为1
第 1 行有 2 个数,位置为 [1,2][1,0],数为23
第 2 行有 3 个数,位置为 [2,0] [2,1] [2,2],数为4 5 6

生成的矩阵为:

1
2
3
4
5
6
7
>>> indptr = np.array([0, 1, 3, 6])
>>> indices = np.array([1,2,0,0,1,2])
>>> data = np.array([1,2,3,4,5,6])
>>> sparse.csr_matrix((data,indices,indptr)).toarray()
array([[0, 1, 0],
[3, 0, 2],
[4, 5, 6]])

csc_matrix

csc_matrix 与之相反,按列存放数据,第i列的非零数据的位置存储在 indices[indptr[i]:indpter[i+1]],对应的数为data[indptr[i]:indpter[i+1]]

1
2
3
4
>>> sparse.csc_matrix((data,indices,indptr)).toarray()
array([[0, 3, 4],
[1, 0, 5],
[0, 2, 6]])

可以看到,使用同样的dataindicesindptrcsv_matrix生成的矩阵正好是csr_matrix的转置