总结元素时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的精度值变化[重复]的主要内容,如果未能解决你的问题,请参考以下文章
关于numpy中的函数return中加入字符串类型数据后,小数点精度变化