我注意到,对于完全随机数的数组,使用 np.sum 与使用 for 循环迭代添加值似乎会产生不同的值。我提供了下面的代码。
我想假设存在一些与浮点数相关的错误,但我不明白为什么会出现这种情况/我尝试过的一件事是截断/舍入到有限数量的小数位,但是这个似乎也引发了类似的问题。
Python 3.9.12 numpy 1.21.5 Windows 10 专业版
提前致谢。
import numpy as np
np.random.seed(1)
x = np.round( np.random.uniform(0, 1, 100), 3)
y = np.sum(x.copy())
z = 0.0
for xi in x.copy():
z += xi
print("y", y) # With seed=1, y=48.585
print("z", z) # With seed=1, z=48.585000000000015
print(y-z)
我尝试过截断/舍入到有限的小数位。
不幸的是,这只是浮点运算的现实。
但是,有一种方法可以测试(几乎)相等性,前提是对许多库中这些波动的绝对和/或相对容忍度:
numpy.isclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)
或
numpy.testing.assert_almost_equal(actual, desired, decimal=7, err_msg='', verbose=True)