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

时间:2014-09-21 19:07:01

标签: python arrays numpy floating-point

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

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)

有一种简单的方法吗?像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

3 个答案:

答案 0 :(得分:13)

如何使用np.isclose

>>> np.isclose(arr_f, a, atol=0.01).any()
True

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

答案 1 :(得分:6)

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

In [1]: (abs(arr_f - a) < t).any()
Out[1]: True

说明:abs(arr_f - a) < t返回一个布尔数组,在该数组上调用any(),以确定其值的任何是否为True

编辑 - 将此方法与other answer中建议的方法进行比较后发现,此方法稍快一些:

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

同样返回相关指数的替代解决方案如下:

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

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

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

In [10]: arr_f[28]
Out[10]: 0.27400000000000002

使用此方法还可以生成True / False结果:

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

答案 2 :(得分:-1)

[temp] = np.where(np.int32((sliceArray - aimFloat) > 0) == 1)

temp[0] 是答案。 sliceArray 已排序!