Numpy 数组进入 if 语句修改其值

Numpy array into if statement modifies its values

我在我的程序中发现了一个问题,但我不知道如何解决它:

首先,我使用 arange 函数创建一个值数组 x_lin 从 0.014 到 0.5,增量为 0.001

之后,我计算了一个名为 r1 的比率,然后感谢 if 语句,我想在首先创建的数组中找到该比率的值 x_lin.

但是,由于将值修改为值数组,if 语句不起作用。

这是代码(我添加了一些打印来显示结果):

Fa = 400
C0 = 3800

r1 = round(Fa/C0,3)    
x_lin = np.arange(0.014, 0.5, 0.001)
j = 0

ligne_r1 = 0
print('xlin=',x_lin)

for j in range(0,np.size(x_lin)):

print('xlin=',x_lin[j], 'r1=',r1, x_lin[j] == r1)

if x_lin[j] == r1:
    ligne_r1 = j

作为 x_lin 的结果,我得到了一个很好的值数组:

xlin= [0.014 0.015 0.016 0.017 0.018 0.019 0.02 ...]

但是当 x_lin 进入 if 语句时,它变成:

xlin= 0.014 r1= 0.105 False
xlin= 0.015 r1= 0.105 False
xlin= 0.016 r1= 0.105 False
xlin= 0.016999999999999998 r1= 0.105 False
xlin= 0.017999999999999995 r1= 0.105 False
xlin= 0.018999999999999996 r1= 0.105 False
xlin= 0.019999999999999997 r1= 0.105 False
xlin= 0.020999999999999994 r1= 0.105 False
...

因此,该陈述永远不会成立。

非常感谢 Whosebug 社区。

这里的问题是Python不能恰好加上0.001,所以用了一个近似值。但是在整个范围内,浮点错误会累积并最终给你一个不精确的结果。

您可以通过在操作中使用整数而不是浮点数来解决这个问题:

xlin = np.arange(14, 500) / 1000

您不能将大多数浮点数(包括 0.017)精确地表示为 float,因为 float 类型的设计精度有限,因此当您添加 0.0010.016 它变成 0.016999999999999998 所以你永远不应该比较浮点数是否相等,而不是 a == b 以这种方式比较它 abs(a - b) < epsilon 例如,epsilon 很小但是正值1e-6.