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

2024-05-13 02:56:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: theinimportnumpyifmyasnp
2条回答

如果您只对True/False结果感兴趣,那么这应该可以工作:

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

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

编辑将此方法与{a1}中建议的方法进行比较,可以发现此方法稍快:

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

^{}怎么样?

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

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

相关问题 更多 >