选csc_matrix还是csr_matrix取决于操作方向:列切片用csc_matrix,行切片用csr_matrix;coo_matrix仅适用于构造阶段,需转为csr/csc才能运算;lil_matrix仅适合动态构建,完成后必须转换;拼接矩阵前须统一格式并校验形状。
稀疏矩阵该选
还是
?
取决于你主要做「列切片」还是「行切片」——
(Compressed Sparse Column)对列操作快,
(Compressed Sparse Row)对行操作快。底层是用三个数组存非零值、行索引、列指针(或反之),结构差异直接决定访问效率。
常见错误现象:
在
上会触发全矩阵转置再切片,慢得离谱;反过来,
在
上也一样。
做特征提取、按列标准化(比如每列减均值)→ 优先用
做样本采样、按行计算 L2 范数、批量预测 → 优先用
从
加载后默认是
,别直接拿去列操作
转换开销不可忽略:
或
是 O(nnz) 时间,不是常数
为什么不能直接做乘法?
是最原始的三元组格式(行索引、列索引、值),不支持算术运算和切片,因为没建索引结构——它连「某行有哪些非零元」都得遍历找。
使用场景:只适合构造阶段。比如从文件逐行读取 (i, j, val),append 到三个列表里,最后一次性转成
,再立刻转成
或
。
立即学习
“
Python免费学习笔记(深入)
”;
误用
做
矩阵乘 → 报错
允许重复 (i,j),但转成
/
时会自动求和,这是隐式行为,容易漏掉数据异常
构造完必须转:用
或
,别留着
做后续计算
适合动态插入,但千万别用它存最终结果
(List of Lists)内部用 Python 列表存每行的列索引和值,支持
这种随机写入,但内存占用高、访问慢、不支持广播运算。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
性能影响明显:10 万行 × 10 万列的稀疏矩阵,用
存可能吃掉 2–3 倍内存,且
比
慢一个数量级。
只在「边生成边填」场景用:比如迭代算法中逐行构造矩阵
填完立刻转:
是标准收尾动作,不是可选项
别用
做
或传给
模型——很多模型内部会检查格式,遇到
直接报
用
拼接矩阵时维度对不上怎么办?
要求子块在逻辑上能排成矩形,比如
中,
必须等于
,
等于
,否则报
或更模糊的
。
容易踩的坑是混用不同格式:比如
是
,
是
,
不会自动统一,可能在拼接中途因格式不兼容崩掉。
拼之前先统一格式:
手动校验形状:
和
,比看报错信息快得多
如果只是水平拼(
),用
更稳;垂直拼用
,它们对形状要求更明确,报错也更直白
稀疏格式转换不是“无感”的,每次
都在重排数据;而不同格式对同一操作的时间差可以到百倍。真正卡住你的往往不是算法,而是矩阵刚加载完就用错了格式。
csc_matrixcsr_matrixcsc_matrixcsr_matrixmat[:, 5]csr_matrixmat[3, :]csc_matrixcsc_matrixcsr_matrixscipy.sparse.load_npz()csrmat.tocsc()mat.tocsr()coo_matrixcoo_matrixcoo_matrixcsrcsccoo_matrix@TypeError: unsupported operand type(s) for @: 'coo_matrix' and 'coo_matrix'coo_matrixcsrcsc.tocsr().tocsc()coolil_matrixlil_matrixmat[i, j] = xlilmat.sum(axis=1)csrmat.tocsr()lil_matrixnp.dotsklearnlilValueError: Expected CSR or CSC matrixscipy.sparse.bmatbmat[[A, B], [C, D]]A.shape[0]C.shape[0]A.shape[1]B.shape[1]ValueError: blocks must be 2-Dinconsistent shapesAcsrBcoobmatA.tocsr(), B.tocsr(), C.tocsr(), D.tocsr()assert A.shape[0] == C.shape[0]assert A.shape[1] == B.shape[1][A, B]scipy.sparse.hstack([A, B])vstack.tocsr()