稀疏矩阵csc_matrix

在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习。我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直达问题本质,把大家从大海捞针的痛苦中解脱出来。

文章目录

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 数组存储每一列的第一个非零元素在 dataindices 中的位置。

对于上面的例子,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=2indices 数组中的元素依次对应为 0 0 0 2 2 2 1 1 1indptr 数组中的元素依次对应为 0 0 0 1 1 1 2 2 2 3 3 3。其中,indptr 数组的长度是 n + 1 n+1 n+1,其中 n n n 是矩阵的列数,最后一个元素表示 dataindices 数组中的元素总数。

需要注意的是,csc_matrix 对象创建后是不可变的,也就是说,不能直接修改其中的元素。如果需要修改稀疏矩阵中的元素,可以先将其转换为其他可修改的稀疏矩阵格式,例如 coo_matrix,修改后再转换回 csc_matrix

2 原因

下面详细说明一下indptr的作用

csc_matrix 中的 indptr 数组主要用于记录每一列的第一个非零元素在 dataindices 数组中的位置,从而实现快速访问稀疏矩阵中的元素。

具体来说,对于稀疏矩阵中的第 j j j 列,它的非零元素在 dataindices 数组中的位置可以通过 indptr[j]indptr[j+1] 来获得。其中,indptr[j] 表示第 j j j 列的第一个非零元素在 dataindices 数组中的起始位置,而 indptr[j+1] 表示第 j + 1 j+1 j+1 列的第一个非零元素在 dataindices 数组中的起始位置。因此,第 j j j 列的非零元素在 data 数组中的位置是 data[indptr[j]:indptr[j+1]],在 indices 数组中的位置是 indices[indptr[j]:indptr[j+1]]

通过这种方式,我们可以避免遍历整个稀疏矩阵来寻找非零元素,从而提高了访问稀疏矩阵元素的效率。同时,由于 indptr 数组的存在,我们可以使用更加紧凑的方式存储稀疏矩阵,从而节省了存储空间。

恭喜你又坚持看完了一篇博客,又进步了一点点!如果感觉还不错就点个赞再走吧,你的点赞和关注将是我持续输出的哒哒哒动力~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿越临界点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值