因为numpy.ndarray会为所有元素(包括大量0)分配内存,导致100万×100万矩阵占用近8TB;而稀疏矩阵仅存非零值及坐标,内存可压缩至KB~MB级。

为什么不能直接用 numpy.ndarray 存稀疏矩阵
当矩阵中 95% 以上元素为 0 时,numpy.ndarray 仍会为每个位置分配内存(比如 float64 占 8 字节),100 万 × 100 万的矩阵会吃掉近 8 TB 内存——这显然不可行。稀疏结构只存非零值及其坐标,内存占用可压缩到 KB ~ MB 级别。
scipy.sparse 的三种常用格式选哪个
核心看你的操作:是频繁按行取、按列取,还是密集计算?
-
csr_matrix:适合按行切片(mat[i, :])、矩阵乘法(@);构建后不可高效增删非零元 -
csc_matrix:适合按列切片(mat[:, j]);和csr互为转置关系,转换开销小(.tocsr()/.tocsc()) -
coo_matrix:只存三元组(row, col, data),构造阶段最灵活(支持重复索引累加),但不支持切片或算术运算;必须转成csr或csc才能计算
例如从文件逐行读取稀疏数据,先用 coo_matrix 收集,再一次性转 csr_matrix,比反复调用 csr_matrix 的 __setitem__ 快 10 倍以上。
手动构建 csr_matrix 时三个数组怎么填
csr_matrix 底层靠三个一维数组:非零值 data、列索引 col_indices、行偏移 indptr。新手常错在 indptr 长度或含义上。
立即学习“Python免费学习笔记(深入)”;
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
假设 3×4 矩阵有非零元:位置 (0,1)=2.0、(1,0)=1.0、(1,2)=3.0、(2,3)=4.0,则:
data = [2.0, 1.0, 3.0, 4.0] col_indices = [1, 0, 2, 3] indptr = [0, 1, 3, 4] # 注意:长度是 n_rows + 1
indptr[i] 表示第 i 行第一个非零元在 data 中的起始下标,indptr[i+1] 是结束下标(左闭右开)。漏掉末尾的 4 或写成 [0,1,3] 会导致 ValueError: index pointer size does not match number of rows。
内存效率真的高吗?得看数据分布和 dtype
稀疏格式本身有额外开销:csr 要存两套索引数组。如果非零密度 > 10%,有时 np.float32 的稠密数组反而更省内存且更快。
- 用
dtype=np.float32构造(如csr_matrix(..., dtype=np.float32)),可减半存储并加速计算 - 避免混用类型:传入
int数据却没指定dtype,默认升为float64,白占一倍空间 - 检查实际稀疏度:
mat.nnz / (mat.shape[0] * mat.shape[1])—— 低于 0.01 才值得上稀疏结构
真正容易被忽略的是:稀疏矩阵的“视图”操作(如 mat[1000:2000, :])会触发内部复制,生成新 csr 对象,不是零拷贝。如果要反复子矩阵运算,考虑预分块或改用 numba 直接操作底层数组。

















