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

np.sum对稀疏矩阵行求和出现非预期非零结果如何解决?

解决方案

你遇到的是双精度浮点数计算的常见精度误差,误差量级在1e-16级别,远小于你矩阵元素的有效数值,可通过以下几种方式解决:

  • 方案1:直接对稀疏矩阵行求和,避免转稠密数组时的额外精度损耗
    scipy稀疏矩阵自带的求和方法底层逻辑适配稀疏存储结构,精度表现更稳定:
    row_sums = sp_m.sum(axis=1).A1
    
    该方法得到的结果误差会远小于转稠密后用np.sum的结果,多数场景下可直接得到和为0的结果。
  • 方案2:显式使用逐个累加逻辑
    如果你需要严格匹配逐个累加的计算结果,可以用np.add.reduce实现逐个累加,规避numpy默认成对求和的精度差异:
    dense = sp_m.toarray()
    # 对每行做逐个累加
    row_sums = np.apply_along_axis(lambda x: np.add.reduce(x), axis=1, arr=dense)
    
  • 方案3:后处理截断微小误差
    由于你的行和理论值严格为0,误差仅为1e-16级别,可直接根据业务精度容忍阈值做截断,实现成本最低:
    # 阈值可根据你的数值量级调整,1e-12足以覆盖双精度浮点数的常规误差范围
    row_sums = np.sum(sp_m.toarray(), axis=1)
    row_sums[np.abs(row_sums) < 1e-12] = 0
    
  • 方案4:使用更高精度浮点类型计算
    对精度要求极高的场景,可将矩阵转为长双精度类型后再求和:
    row_sums = np.sum(sp_m.toarray().astype(np.longdouble), axis=1).astype(np.float64)
    

内容的提问来源于stack exchange,提问作者Ioanna K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:15:04