在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习。我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直达问题本质,把大家从大海捞针的痛苦中解脱出来。
1 定义
csc_matrix
是 SciPy 库中的一个稀疏矩阵格式,用于表示稀疏矩阵。它的全称是 Compressed Sparse Column matrix,也就是压缩稀疏列矩阵。与稠密矩阵不同,稀疏矩阵中大部分元素都是 0,而只有很少一部分非零元素。
csc_matrix
存储一个稀疏矩阵的方式是将非零元素按列存储,并记录每一列的起始位置和非零元素的行索引。具体来说,csc_matrix
中包含以下三个数组:
- data:一个一维数组,存储所有非零元素的值;
- indices:一个一维数组,存储所有非零元素的行索引;
- indptr:一个一维数组,存储每一列的第一个非零元素在 data 和 indices 中的位置。
下面给出一个简单的例子和代码。
假设有一个 3 × 3 3 \times 3 3×3 的稀疏矩阵:
[ 1 0 0 0 0 2 0 3 0 ] \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 2 \\ 0 & 3 & 0 \end{bmatrix} 100003020
对应的 csc_matrix
可以表示为:
from scipy.sparse import csc_matrix
# 定义稀疏矩阵的 data、indices 和 indptr 数组
data = [1, 3, 2]
indices = [0, 2, 1]
indptr = [0, 1, 2, 3]
# 创建 csc_matrix 对象
A = csc_matrix((data, indices, indptr), shape=(3, 3))
其中,data
数组存储非零元素的值,indices
数组存储非零元素的行索引,indptr
数组存储每一列的第一个非零元素在 data
和 indices
中的位置。
对于上面的例子,data
数组中的元素依次对应为
A
0
,
0
=
1
A_{0,0}=1
A0,0=1、
A
2
,
0
=
3
A_{2,0}=3
A2,0=3、
A
1
,
2
=
2
A_{1,2}=2
A1,2=2,indices
数组中的元素依次对应为
0
0
0、
2
2
2、
1
1
1,indptr
数组中的元素依次对应为
0
0
0、
1
1
1、
2
2
2、
3
3
3。其中,indptr
数组的长度是
n
+
1
n+1
n+1,其中
n
n
n 是矩阵的列数,最后一个元素表示 data
和 indices
数组中的元素总数。
需要注意的是,csc_matrix
对象创建后是不可变的,也就是说,不能直接修改其中的元素。如果需要修改稀疏矩阵中的元素,可以先将其转换为其他可修改的稀疏矩阵格式,例如 coo_matrix
,修改后再转换回 csc_matrix
。
2 原因
下面详细说明一下indptr的作用
csc_matrix
中的 indptr
数组主要用于记录每一列的第一个非零元素在 data
和 indices
数组中的位置,从而实现快速访问稀疏矩阵中的元素。
具体来说,对于稀疏矩阵中的第
j
j
j 列,它的非零元素在 data
和 indices
数组中的位置可以通过 indptr[j]
和 indptr[j+1]
来获得。其中,indptr[j]
表示第
j
j
j 列的第一个非零元素在 data
和 indices
数组中的起始位置,而 indptr[j+1]
表示第
j
+
1
j+1
j+1 列的第一个非零元素在 data
和 indices
数组中的起始位置。因此,第
j
j
j 列的非零元素在 data
数组中的位置是 data[indptr[j]:indptr[j+1]]
,在 indices
数组中的位置是 indices[indptr[j]:indptr[j+1]]
。
通过这种方式,我们可以避免遍历整个稀疏矩阵来寻找非零元素,从而提高了访问稀疏矩阵元素的效率。同时,由于 indptr
数组的存在,我们可以使用更加紧凑的方式存储稀疏矩阵,从而节省了存储空间。
恭喜你又坚持看完了一篇博客,又进步了一点点!如果感觉还不错就点个赞再走吧,你的点赞和关注将是我持续输出的哒哒哒动力~~