我需要检查给定的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
答案 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 已排序!