应直接用 scipy.sparse.csr_matrix 从三元组构建,避免 pandas.SparseDtype;优先选 coo_matrix 构造再转 csr/csc,按访问模式选格式,并显式指定小整数 dtype 以节省内存。

直接用 scipy.sparse.csr_matrix 构造,别碰 pandas.SparseDtype
几十万空值的二维结构,根本不是 pandas.SparseDtype 的使用场景。它只支持单列稀疏,底层仍是带掩码的密集数组,转成矩阵前必须调用 .to_dense()——这一步就会 OOM。真实稀疏矩阵要保留 (row, col) 坐标语义,SparseDtype 完全不存行信息。
正确路径是绕过 pandas,从原始三元组(非零值 + 行索引 + 列索引)直接构建:csr_matrix((data, (rows, cols)), shape=(M, N), dtype=np.int32)。dtype 必须显式指定:若非零值全是 0–255 的整数,用 np.uint8 能把每个元素内存从 8 字节(float64 默认)压到 1 字节。
coo_matrix 是最安全的构造入口,别用 dok_matrix 增量赋值
常见错误是循环写 dok_matrix[ i, j ] = val,每赋一次就新建一个 Python dict 键值对。10 万次操作 ≈ 10 万个 dict 对象,内存和速度都崩。
换成 coo_matrix 一次性喂入全部三元组:
立即学习“Python免费学习笔记(深入)”;
import numpy as np from scipy.sparse import coo_matrix <h1>假设你有三组平行数组</h1><p>rows = np.array([0, 1, 1, 2]) cols = np.array([0, 1, 2, 0]) data = np.array([1, 2, 3, 4], dtype=np.int32)</p><p>coo = coo_matrix((data, (rows, cols)), shape=(3, 3)) csr = coo.tocsr() # 转 CSR 后再用
注意:coo_matrix 本身不支持算术运算,只是个“中转站”,构造完立刻转 .tocsr() 或 .tocsc()。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
选 csr_matrix 还是 csc_matrix?看你的主要操作类型
CSR 和 CSC 不是性能高低之分,而是访问模式适配问题:
- 频繁按行取数据(如推荐系统里取某个 user 的所有 item 评分)、做
M @ v(矩阵乘向量),选csr_matrix - 频繁按列取数据(如 NLP 中取某个 term 的所有文档频次)、做
v @ M(向量左乘),选csc_matrix - 两者互相转换成本很低(
.tocsr()/.tocsc()),但别在热循环里反复转
如果不确定,先用 CSR;它在绝大多数机器学习 pipeline(如 sklearn 的 fit())里是默认格式。
内存没降下来?检查 indptr 和 indices 的 dtype
csr_matrix 有三个核心数组:data(值)、indices(列索引)、indptr(行指针)。后两者默认是 int64,哪怕矩阵只有 1000 行,也浪费一倍内存。
构造时强制指定小整数类型:
# 假设最大行数 < 65536,最大列数 < 65536 coo = coo_matrix((data, (rows, cols)), shape=(M, N), dtype=np.int16) csr = coo.tocsr() csr.indices = csr.indices.astype(np.uint16) # 列索引 csr.indptr = csr.indptr.astype(np.uint16) # 行指针
这个细节容易被忽略:即使 data 用了 uint8,若 indices 和 indptr 还是 int64,整体内存可能只省了 10%。

















