总结元素时numpy float32的精度值变化[重复]

Posted

技术标签:

【中文标题】总结元素时numpy float32的精度值变化[重复]【英文标题】:Change in precision value of numpy float32 while summing up the elements [duplicate] 【发布时间】: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。 有什么办法可以克服吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于总结元素时numpy float32的精度值变化[重复]的主要内容,如果未能解决你的问题,请参考以下文章

int 转 float 为啥有时会丢失精度

关于numpy中的函数return中加入字符串类型数据后,小数点精度变化

numpy库使用总结

Numpy (基本数据类型)

NumPy 类型提示某事物既是数组又是 float32? [复制]

mysql float精度与范围总结