You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效给scipy稀疏矩阵赋值?解决csr_matrix赋值警告问题

CSR矩阵元素赋值的高效解决方案

问题场景

创建100000×100000的csr_matrix后,执行A[2,3]=1这类单个元素赋值操作时,会触发SparseEfficiencyWarning,提示修改CSR矩阵的稀疏结构成本很高,推荐使用lil_matrix。

可行解决方案

1. 少量赋值时直接忽略警告

如果只是偶尔做几次单个元素赋值,直接忽略警告即可,也可以通过代码主动关闭警告:

from scipy.sparse import csr_matrix
import warnings
import scipy

# 关闭稀疏效率警告
warnings.filterwarnings("ignore", category=scipy.sparse.SparseEfficiencyWarning)

A = csr_matrix((100000, 100000), dtype=float)
A[2,3] = 1

2. 转换为LIL矩阵进行赋值(适合频繁修改)

LIL(List of Lists)矩阵专门针对频繁修改稀疏结构的场景优化,赋值操作效率远高于CSR:

from scipy.sparse import csr_matrix, lil_matrix

# 先创建LIL矩阵
A_lil = lil_matrix((100000, 100000), dtype=float)
# 执行赋值操作,无性能问题
A_lil[2,3] = 1
A_lil[5,10] = 3.5
# 完成所有赋值后,再转换回CSR矩阵用于后续计算
A_csr = A_lil.tocsr()

3. 批量赋值(最高效方式)

如果需要赋值多个元素,直接通过坐标和值批量初始化或更新是最优选择,避免逐个修改:

from scipy.sparse import csr_matrix
import numpy as np

# 准备要赋值的坐标和对应值
rows = [2, 5, 10]
cols = [3, 10, 15]
values = [1, 3.5, 2]

# 方式1:直接用坐标初始化CSR矩阵
A = csr_matrix((values, (rows, cols)), shape=(100000, 100000), dtype=float)

# 方式2:给已有的CSR矩阵批量更新(需先转为COO矩阵)
A = csr_matrix((100000, 100000), dtype=float)
coo_A = A.tocoo()
# 添加新的坐标和值
coo_A.row = np.append(coo_A.row, rows)
coo_A.col = np.append(coo_A.col, cols)
coo_A.data = np.append(coo_A.data, values)
# 转换回CSR矩阵
A = coo_A.tocsr()

内容的提问来源于stack exchange,提问作者zell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:36:22