稀疏矩阵的 CSR 格式(Compressed Sparse Row)

CSR 是一种存储稀疏矩阵的高效格式,通过只存储非零元素来节省内存。它用三个数组来表示矩阵。

1. 三个核心数组

假设我们有一个稀疏矩阵:

复制代码
[[1, 0, 0, 2],
 [0, 3, 4, 0],
 [5, 0, 0, 6]]

CSR 格式需要三个数组:

data 数组

存储所有非零元素的值,按行优先顺序排列:

复制代码
data = [1, 2, 3, 4, 5, 6]
indices 数组

存储每个非零元素所在的列索引:

复制代码
indices = [0, 3, 1, 2, 0, 3]
indptr 数组

行指针数组,长度为 行数 + 1,存储每行第一个非零元素在 data 中的起始位置:

复制代码
indptr = [0, 2, 4, 6]

解释,

indptr[0] =0 指出第0行从 data0 开始

indptr[1] =2 指出第1行从 data2 开始

indptr[2] =4 指出第2行从 data4 开始

indptr[3] =6 指出结束位置,同时最后这个值也会等于元素个数。

2. 矩阵重建过程

通过三个数组可以完全恢复原矩阵:

  • 第0行 data[indptr[0]:indptr[1]] = [1, 2],对应列 indices[0:2] = [0, 3]

  • 第1行 data[indptr[1]:indptr[2]] = [3, 4],对应列 indices[2:4] = [1, 2]

  • 第2行 data[indptr[2]:indptr[3]] = [5, 6],对应列 indices[4:6] = [0, 3]

3. 代码示例

python 复制代码
import numpy as np
from scipy.sparse import csr_matrix

# 创建稀疏矩阵
dense_matrix = np.array([[1, 0, 0, 2],
                         [0, 3, 4, 0],
                         [5, 0, 0, 6]])

# 转换为CSR格式
sparse_csr = csr_matrix(dense_matrix)

# 查看三个数组
print(f"data: {sparse_csr.data}")
print(f"indices: {sparse_csr.indices}")
print(f"indptr: {sparse_csr.indptr}")

# 从CSR格式重建
reconstructed = sparse_csr.toarray()
print(f"重建矩阵:\n{reconstructed}")

4. 优点和缺点

优点

节省内存,只存储非零元素

行切片和矩阵乘法效率高

适合行访问频繁的场景

缺点

列访问效率低

频繁插入/删除非零元素代价高

比 COO 格式复杂

5. 适用场景

机器学习中的特征矩阵(通常是行表示样本,列表示特征)

图算法中的邻接矩阵

有限元分析

任何行访问频繁的稀疏矩阵运算

CSR 格式是现代科学计算和机器学习中最常用的稀疏矩阵存储格式之一,特别是在处理大规模数据时。

相关推荐
冬奇Lab7 分钟前
Workflow 系列(02):设计范式——四层架构、三种 Context 传递模式与确认门设计
人工智能·agent·工作流引擎
冬奇Lab15 分钟前
每日一个开源项目(第145篇):Trellis - 把项目记忆、规范和任务上下文持久化进代码仓库
人工智能·开源·资讯
有道AI情报局16 分钟前
Harness即产品
人工智能·agent
罗西的思考1 小时前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
IT_陈寒3 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端
笃行3503 小时前
从零到上线:用 EdgeOne Makers + CodeBuddy 搭一个「对账核对员」AI Agent
人工智能
用户6856326208693 小时前
Claude Code 乱猜字段名?我给它写了一个"数据库查询约束 Skill"
人工智能
你_好3 小时前
# 给你的产品嵌入一个「会操作界面的 AI 助手」
人工智能
ShallWeL3 小时前
【机器学习】(3)—— 线性回归:梯度下降
人工智能·机器学习
陈广亮3 小时前
Prompt、Context、Harness、Agentic:LLM 应用四层嵌套结构,搞清自己卡在哪一层
人工智能