为了账号安全,请及时绑定邮箱和手机立即绑定

检查特定浮点值是否在 Python/numpy 的列表/数组中

检查特定浮点值是否在 Python/numpy 的列表/数组中

慕尼黑的夜晚无繁华 2021-12-09 15:52:33
在检查浮点数之间的相等性时需要小心,并且通常应该考虑到容差,例如使用numpy.allcose。问题 1:使用“in”关键字检查特定浮点数的出现是否安全(或者是否有类似的关键字/函数用于此目的)?例子:if myFloatNumber in myListOfFloats:  print('Found it!')else:  print('Sorry, no luck.')问题 2:如果不是,那么整洁的解决方案是什么?
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

如果您不在同一个地方或使用完全相同的方程计算浮点数,那么此代码可能会出现假阴性(由于舍入错误)。例如:


>>> 0.1 + 0.2 in [0.6/2, 0.3]  # We may want this to be True

False

在这种情况下,我们可以只使用一个自定义的“ in”函数来实际实现这一点(在这种情况下,使用numpy.isclose代替可能更好/更快numpy.allclose):


import numpy as np 


def close_to_any(a, floats, **kwargs):

  return np.any(np.isclose(a, floats, **kwargs))

文档中有一个重要的说明:


警告 默认atol值不适用于比较远小于 1 的数字(请参阅注释)。[...] 如果预期值明显小于 1,则可能导致误报。


该注释补充说,atol与math.isclose's相反,它不是零abs_tol。如果您在使用时需要自定义容差close_to_any,请使用kwargsto passrtol和/或atoldown to numpy. 最后,您现有的代码将转换为:


if close_to_any(myFloatNumber, myListOfFloats):

  print('Found it!')

else:

  print('Sorry, no luck.')

或者您可以有一些 options close_to_any(myFloatNumber, myListOfFloats, atol=1e-12),请注意这1e-12是任意的,除非您有充分的理由,否则不应使用此值。


回到我们在第一个示例中观察到的舍入误差,这将给出:


>>> close_to_any(0.1 + 0.2, [0.6/2, 0.3])

True


查看完整回答
反对 回复 2021-12-09
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

Q1:取决于您将如何实施。但正如其他人提到的浮动,使用in运算符并不是一个好主意。


Q2:您在性能方面有任何限制吗?会myListOfFloats排序吗?


如果它是一个排序的浮点值列表,并且您需要尽可能快地完成它,则可以实现二进制搜索算法。


如果数据未排序,根据您将进行的查询数量与数据大小之间的比率,您可能希望对数据进行排序并保持排序。


如果您对性能和速度没有任何要求,可以使用以下示例作为基础:


def inrng(number1,number2,prec):

   if(abs(number1-number2)<prec):

      return True

   else:

      return False



precision=0.001

for i in myListOfFloats:

   if(inrng(i,myInputNumber,precision)):

      #do stuff


查看完整回答
反对 回复 2021-12-09
  • 2 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信