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.001
到 0.016
它变成 0.016999999999999998
所以你永远不应该比较浮点数是否相等,而不是 a == b
以这种方式比较它 abs(a - b) < epsilon
例如,epsilon 很小但是正值1e-6
.
我在我的程序中发现了一个问题,但我不知道如何解决它:
首先,我使用 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.001
到 0.016
它变成 0.016999999999999998
所以你永远不应该比较浮点数是否相等,而不是 a == b
以这种方式比较它 abs(a - b) < epsilon
例如,epsilon 很小但是正值1e-6
.