gpt4 book ai didi

python - 在包括标量的 numpy 数组操作中取消

转载 作者:太空宇宙 更新时间:2023-11-03 15:17:07 25 4
gpt4 key购买 nike

我使用的是 NumPy 1.7.1 版。现在我遇到了一个我不明白的奇怪的取消:

>>> import numpy as np
>>> a = np.array([ 883, 931, 874], dtype=np.float32)

数学上 a+0.1-a 应该是 0.1。现在让我们计算一下的值(value)这个表达式以及绝对和相对错误:

>>> a+0.1-a
array([ 0.09997559, 0.09997559, 0.09997559], dtype=float32)
>>> (a+0.1-a)-0.1
array([ -2.44155526e-05, -2.44155526e-05, -2.44155526e-05], dtype=float32)
>>> ((a+0.1-a)-0.1) / 0.1
array([-0.00024416, -0.00024416, -0.00024416], dtype=float32)

第一个问题:这是一个相当高的绝对和相对误差,这只是灾难性的取消,不是吗?

第二个问题:当我使用数组而不是标量时,NumPy 能够更精确地计算,请参见相对误差:

>>> a+np.array((0.1,)*3)-a
array([ 0.1, 0.1, 0.1])
>>> (a+np.array((0.1,)*3)-a)-0.1
array([ 2.27318164e-14, 2.27318164e-14, 2.27318164e-14])

我猜这只是 0.1 的数字表示。

但是,如果使用标量而不是像 a+0.1-a 中那样的数组,为什么 NumPy 不能以相同的方式处理这个问题?

最佳答案

如果您使用 double ,情况就会发生变化。你得到的是单精度的预期结果(np.float32):

a = np.array([ 883,  931,  874], dtype=np.float64)

a+0.1-a
# array([ 0.1, 0.1, 0.1])

((a+0.1-a)-0.1) / 0.1
# array([ 2.27318164e-13, 2.27318164e-13, 2.27318164e-13])

在表达式中间使用 np.array((0.1,)*3) 将所有内容都转换为 float64,这说明了第二个结果的精度更高。

关于python - 在包括标量的 numpy 数组操作中取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20147828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com