检查float是否接近存储在数组中的任何float

Gab*_*iel 7 python arrays floating-point numpy

我需要检查一个给定的浮点数是否在给定的容差范围内接近浮点数组中的任何浮点数.

import numpy as np

# My float
a = 0.27
# The tolerance
t = 0.01
# Array of floats
arr_f = np.arange(0.05, 0.75, 0.008)
Run Code Online (Sandbox Code Playgroud)

有一个简单的方法吗?有什么比这样if a in arr_f:但是允许区别的容忍度?


"允许容忍"我的意思是以下意义:

for i in arr_f:
    if abs(a - i) <= t:
        print 'float a is in arr_f within tolerance t'
        break
Run Code Online (Sandbox Code Playgroud)

Ale*_*ley 13

怎么用np.isclose

>>> np.isclose(arr_f, a, atol=0.01).any()
True
Run Code Online (Sandbox Code Playgroud)

np.isclose以元素方式比较两个对象,以查看值是否在给定的容差范围内(此处由关键字参数指定,atol这是两个元素之间的绝对差异).该函数返回一个布尔数组.


Yoe*_*oel 6

如果你只对True/ False结果感兴趣,那么这应该有效:

In [1]: (abs(arr_f - a) < t).any()
Out[1]: True
Run Code Online (Sandbox Code Playgroud)

说明:abs(arr_f - a) < t返回一个any()调用的布尔数组,以便查明其是否有任何True.

编辑 - 比较这种方法和另一个答案中建议的方法表明这个方法稍快一点:

In [37]: arr_f = np.arange(0.05, 0.75, 0.008)

In [38]: timeit (abs(arr_f - a) < t).any()
100000 loops, best of 3: 11.5 µs per loop

In [39]: timeit np.isclose(arr_f, a, atol=t).any()
10000 loops, best of 3: 44.7 µs per loop

In [40]: arr_f = np.arange(0.05, 1000000, 0.008)

In [41]: timeit (abs(arr_f - a) < t).any()
1 loops, best of 3: 646 ms per loop

In [42]: timeit np.isclose(arr_f, a, atol=t).any()
1 loops, best of 3: 802 ms per loop
Run Code Online (Sandbox Code Playgroud)

另一种也返回相关指数的解决方案如下:

In [5]: np.where(abs(arr_f - a) < t)[0]
Out[5]: array([27, 28])
Run Code Online (Sandbox Code Playgroud)

这意味着驻留在索引27和28中的值在arr_f期望的范围内,并且实际上:

In [9]: arr_f[27]
Out[9]: 0.26600000000000001

In [10]: arr_f[28]
Out[10]: 0.27400000000000002
Run Code Online (Sandbox Code Playgroud)

使用这种方法也可以生成True/ False结果:

In [11]: np.where(abs(arr_f - a) < t)[0].any()
Out[11]: True
Run Code Online (Sandbox Code Playgroud)