csr_matrix通过仅存储非零值、列索引和行偏移三个数组来节省内存,相比dense array在高维稀疏场景(如TF-IDF)可将内存占用从爆内存降至几十MB。

csr_matrix 为什么比 dense array 节省内存
稀疏矩阵在特征维度高但大部分值为零时(比如文本 TF-IDF、用户-物品交互)能大幅压缩内存。用 scipy.sparse.csr_matrix 存储,只保存非零值、列索引和行偏移三个数组,而非整个二维结构。一个 100 万 × 1 万的矩阵,若密度仅 0.01%,用 csr_matrix 可能只占几十 MB,而 numpy.ndarray 直接爆内存。
注意:CSR 不是万能的——它适合按行切片、矩阵乘法(如 model.fit(X, y)),但按列取子集(如 X[:, [0,5]])会触发隐式转换为 CSC,慢且临时增内存。
如何安全地把 pandas DataFrame 或 list 转成 csr_matrix
别直接用 csr_matrix(df.values)——如果 df 含 object 类型或缺失值,会静默转成 object 数组,后续 fit() 报错 TypeError: no supported conversion for types。
- 先确保数据是数值型:
df = df.astype(np.float32)(用float32而非默认float64,省一半内存) - 缺失值必须显式填充:
df = df.fillna(0),不能留np.nan - 再构造:
from scipy.sparse import csr_matrix; X_sparse = csr_matrix(df.values) - 如果是词频类 list of dict(如 CountVectorizer 输出前),优先用
DictVectorizer(sparse=True),它内部自动建 CSR,比先转 dense 再转 sparse 快得多
Scikit-learn 模型对 csr_matrix 的兼容性差异
不是所有 estimator 都“原生友好”稀疏输入。有些内部会悄悄转 dense,白费 CSR 的优势。
- 安全:
LogisticRegression、SVC(kernel='linear')、RandomForestClassifier(从 1.0+ 开始支持)、TruncatedSVD - 危险:
KMeans(旧版强制 densify)、StandardScaler(不支持稀疏,得用MaxAbsScaler或Normalizer替代) - 检查方法:训练后看模型对象是否有
sparse=True属性,或用type(model._X)(部分模型存原始输入)确认是否仍为csr_matrix
csr_matrix 的 in-place 修改陷阱
csr_matrix 不支持直接赋值修改元素,比如 X[0, 1] = 5 会报 NotImplementedError;强行用 X.tolil()[0,1] = 5 则创建全副本,瞬间吃光内存。
真要改,分三步走:
- 提取三元组:
data, row, col = scipy.sparse.find(X) - 用
numpy过滤/更新data数组(例如设负值为 0) - 重建:
X_new = csr_matrix((data, (row, col)), shape=X.shape)
更常见的是归一化或缩放——这时别手写循环,直接用 sklearn.preprocessing.Normalizer(norm='l2').fit_transform(X),它专为稀疏优化,全程 CSR 内运算。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











