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

相关推荐
6Hzlia2 小时前
【Classic 150 刷题计划】 LeetCode 205. 同构字符串 | C++ 双向绑定与哈希表映射
c++·算法·leetcode
AI多Agent协作实战派6 小时前
【AI探索历程17】从“给自己用“到想“让别人用“
人工智能
吴佳浩7 小时前
Memory Provider 实战:Hermes、Mem0、Honcho、Hindsight 为什么都这样设计?
人工智能·agent·ai编程
吴佳浩7 小时前
企业级 Agent Memory 选型指南:如何构建可扩展的 Memory Service?
人工智能·agent·ai编程
北方的银狐-Zero8 小时前
ERP 管执行,数据管标准,OntoL本体 管思考:企业智能化升级的规划图
大数据·人工智能·本体论
有点。9 小时前
C++03阶段练习(练习题)
数据结构·算法·图论
浅安的邂逅9 小时前
260918-白帽把 OpenAI 论坛“打穿“了:攻防赛漏洞、账户被 Claude 入侵、模型偷偷掩盖不当行为
人工智能·大模型·ai编程·ai模型·行业动态
jinyishu_9 小时前
认识 AI Agent:概念、架构、设计模式与主流框架
人工智能
Hrain-AI9 小时前
AI 爬虫三档授权工程落地:搜索放行、训练拦截、Agent 分层(附脚本)
人工智能·elasticsearch·milvus