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
相关产品推荐
相关产品推荐

