【问题标题】:Change in precision value of numpy float32 while summing up the elements [duplicate]总结元素时numpy float32的精度值变化[重复]
【发布时间】:2022-01-19 20:16:39
【问题描述】:

我有一个数组,我想按列计算元素的总和 (column_sum),然后将列元素除以 column_sum,这样除法后,列元素的总和就等于 1。

代码:

import numpy as np

# sample array
arr = np.array([[0.045, 0.531, 0.53],
              [0.968, 0.051, 0.013],
              [0.653, 0.304, 0.332],
              [0.065, 0.123, 0.033], 
              [0.035, 0.328, 0.333], 
              [0.065, 0.330, 0.333]], np.float32)

print("before\n", arr)
arr_sum = np.array(arr.sum(axis=0),dtype=np.float32)
arr = arr / arr_sum
print("\nafter\n",arr)
print("\ncolumn_sum after division\n")
print(np.array(arr.sum(axis=0),dtype=np.float32))

这里我取 column_sum 并将每个列元素与其对应的 column_sum 相除。

上面的代码给了我这样的输出:

before

[[0.045 0.531 0.53 ]
 [0.968 0.051 0.013]
 [0.653 0.304 0.332]
 [0.065 0.123 0.033]
 [0.035 0.328 0.333]
 [0.065 0.33  0.333]]

after

[[0.02457674 0.31853628 0.33672175]
 [0.5286729  0.03059388 0.00825921]
 [0.35663575 0.1823635  0.21092758]
 [0.03549973 0.07378524 0.02096569]
 [0.01911524 0.19676064 0.21156292]
 [0.03549973 0.19796039 0.21156292]]

column_sum after division

[1.         0.99999994 1.0000001 ]

但实际的 column_sum 必须精确为 1(概率之和)或 给出这样的输出:

[1.    1.    1.] 

这是使用数据类型 float32 时发生的情况。元素必须是 numpy.float32 类型,并且总和必须为 1。 有什么办法可以克服吗?

【问题讨论】:

    标签: python arrays numpy probability float32


    【解决方案1】:

    欢迎来到浮点运算。请记住,数字 0.045 不能用二进制精确表示。这是一个无限重复的值,所以你在寄存器中得到的是一个近似值。随着您做更多的数学运算,这些近似误差会累积。你永远不会得到精确的 1.0。如果您需要将它们四舍五入打印,则在打印时进行四舍五入

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-28
      • 2021-02-01
      • 2019-07-28
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      相关资源
      最近更新 更多