检查python/numpy中的列表/数组中是否有特定的浮点数



在检查浮点数之间是否相等时需要注意,并且通常应考虑使用例如,例如,使用例如。numpy.allcose。

问题1:使用" in"关键字检查特定的浮点号是否安全(或为此目的是否有相似的关键字/函数)?示例:

if myFloatNumber in myListOfFloats:
  print('Found it!')
else:
  print('Sorry, no luck.')

问题2:如果不是,那么整洁的解决方案是什么?

如果您不在同一位置或完全相同的方程式计算浮子,则可能对此代码有错误的负面因素(由于舍入错误)。例如:

>>> 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不适合比较比一个小得多的数字(请参见说明)。 [...] 如果预期值明显小于一个,则可能导致误报。

注释补充说,atolmath.iscloseabs_tol并不为零。如果使用close_to_any时需要自定义公差,请使用kwargsrtol和/或atol传递给Numpy。最后,您现有的代码将转化为:

if close_to_any(myFloatNumber, myListOfFloats):
  print('Found it!')
else:
  print('Sorry, no luck.')

或者您可以有一些选项close_to_any(myFloatNumber, myListOfFloats, atol=1e-12),请注意1e-12是任意的,除非您有充分的理由。

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

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

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

相关内容

  • 没有找到相关文章

最新更新