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

为何scipy coo_matrix会存储numpy判定为0.0的元素?

为什么Scipy的COO稀疏矩阵会存储精确值为0.0的元素?

我用Python结合numpy/scipy生成了一个coo_matrix,发现稀疏矩阵里存了多个值为0.0的元素,转换为数组后这些元素确实是np.float64(0.0),不是极小的非零值。我本以为这些0.0元素不会被存在稀疏矩阵里,想不通:既然numpy判定这些值是0.0,为什么scipy还要保留它们?

生成的coo_matrix:

<COOrdinate sparse array of dtype 'float64'
    with 21 stored elements and shape (403, 196)>
  Coords    Values
  (206, 138)    0.0
  (206, 139)    0.23614037219163428
  (206, 140)    0.2366397154157327
  (206, 141)    0.236805402497099
  (206, 142)    0.0
  (207, 138)    0.3928269859331709
  (207, 139)    0.3939331263543298
  (207, 140)    0.3995270442982785
  (207, 141)    0.3821409243437723
  (207, 142)    0.3638856690042628
  (208, 138)    0.3935915394673921
  (208, 139)    0.3957499496341213
  (208, 140)    0.39550968408901105
  (208, 141)    0.38493115738953887
  (208, 142)    0.0
  (209, 138)    0.0
  (209, 139)    0.3917329284904307
  (209, 140)    0.39178317681678937
  (209, 141)    0.3796339720019004
  (210, 139)    0.0
  (210, 140)    0.40025290199002156

预期的coo_matrix:

<COOrdinate sparse array of dtype 'float64'
    with 21 stored elements and shape (403, 196)>
  Coords    Values
  (206, 139)    0.23614037219163428
  (206, 140)    0.2366397154157327
  (206, 141)    0.236805402497099
  (207, 138)    0.3928269859331709
  (207, 139)    0.3939331263543298
  (207, 140)    0.3995270442982785
  (207, 141)    0.3821409243437723
  (207, 142)    0.3638856690042628
  (208, 138)    0.3935915394673921
  (208, 139)    0.3957499496341213
  (208, 140)    0.39550968408901105
  (208, 141)    0.38493115738953887
  (209, 139)    0.3917329284904307
  (209, 140)    0.39178317681678937
  (209, 141)    0.3796339720019004
  (210, 140)    0.40025290199002156

验证代码:

np.set_printoptions(precision=100, suppress=True)
print(coo[0].toarray()[206,138])

输出结果为0.0或np.float64(0.0),无极小非零值。


解答

Scipy的COO稀疏矩阵构造逻辑是完全信任输入数据,它不会自动检查并过滤值为0.0的元素——只要你在构造时把某个坐标对应的数值设为0.0并包含在输入数组里,这个条目就会被原样存储下来,不管数值是不是0。

这种设计是为了保持灵活性:有些场景下用户可能故意要存储0值(比如特定的稀疏矩阵运算需求),所以Scipy不会擅自替用户决定要删除哪些元素。

如果要移除这些无用的0值元素,只需显式调用eliminate_zeros()方法:

# 生成COO矩阵后清理0值元素
coo_mat = coo_matrix(data=(values, (rows, cols)), shape=(403, 196))
coo_mat.eliminate_zeros()

调用后,矩阵会自动遍历所有存储元素,删除值为0的条目,同时更新存储的坐标和数值数组,得到你预期的结果。

内容的提问来源于stack exchange,提问作者Firestar-Reimu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:45:20