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

scipy计算csc_array矩阵指数触发SparseEfficiencyWarning如何解决

问题说明

对csc格式稀疏矩阵计算矩阵指数时,触发如下效率警告:

anaconda3/lib/python3.9/site-packages/scipy/sparse/_index.py:103:
SparseEfficiencyWarning: Changing the sparsity structure of a
csc_matrix is expensive. lil_matrix is more efficient.
  self._set_intXint(row, col, x.flat[0])

触发警告的代码如下,其中t_M为dok_array类型:

csc_t_M = t_M.tocsc()
sigma = scipy.sparse.linalg.expm(-csc_t_M)

从调用栈看,警告由scipy.sparse内部逻辑触发。

原因

scipy.sparse.linalg.expm的内部实现存在逐元素修改输入矩阵稀疏结构的操作。csc格式的优化方向是矩阵运算、格式转换,单点修改元素/变更稀疏结构的开销极高,因此scipy会抛出效率提示。该警告不影响计算结果的正确性,仅提示存在不必要的性能损耗。
不要按照警告提示直接将矩阵转为lil格式传入expm,lil格式不支持expm依赖的稀疏矩阵运算,会直接抛出运行错误。

修复方案
  • 方案1:忽略指定警告(适合矩阵规模不大、性能损耗可接受的场景)
    该警告仅为效率提示,不影响结果,可在调用expm时临时屏蔽对应警告:
    import warnings
    from scipy.sparse import SparseEfficiencyWarning
    
    csc_t_M = t_M.tocsc()
    with warnings.catch_warnings():
        warnings.simplefilter("ignore", SparseEfficiencyWarning)
        sigma = scipy.sparse.linalg.expm(-csc_t_M)
    
  • 方案2:转换为csr格式传入(可从根源规避该警告,推荐)
    将输入矩阵转为csr格式后再传入expm,scipy内部处理csr格式矩阵时不会触发逐元素修改稀疏结构的逻辑,不会抛出警告,计算结果与传入csc矩阵完全一致:
    # 直接从原dok_array转csr即可,无需先转csc
    csr_t_M = t_M.tocsr()
    sigma = scipy.sparse.linalg.expm(-csr_t_M)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:09:10