Python 使用numpy查找数组中第一个元素的索引,该索引接近公差范围内的浮点值
我需要找到数组中第一个元素的索引,它接近给定容差内的浮点值 我可以使用for块执行此操作:Python 使用numpy查找数组中第一个元素的索引,该索引接近公差范围内的浮点值,python,arrays,numpy,Python,Arrays,Numpy,我需要找到数组中第一个元素的索引,它接近给定容差内的浮点值 我可以使用for块执行此操作: import numpy as np # Define array of floats a = np.random.uniform(0., 10., 10.) # Float to search, and tolerance. val, tol = 6.87, 0.1 for i, _ in enumerate(a): if np.isclose(_, val, tol):
import numpy as np
# Define array of floats
a = np.random.uniform(0., 10., 10.)
# Float to search, and tolerance.
val, tol = 6.87, 0.1
for i, _ in enumerate(a):
if np.isclose(_, val, tol):
print('Index is: {}'.format(i))
break
但我想知道是否有一个使用numpy
函数的单行程序解决方案
请注意,我对第一个接近val
的元素的索引感兴趣,而不管a
数组下面可能有更接近的元素。我发现的解决方案对最近值的索引感兴趣,不管它位于数组中的哪个位置。这里有一个单行:
Index = next(i for i, _ in enumerate(a) if np.isclose(_, val, tol))
这是什么?
括号中的代码是生成器表达式,next
返回(您猜对了!)生成器将生成的下一个(在本例中是第一个)值。如果没有下一个值,将引发StopIteration
异常
优势
FirstIndex = lambda a, val, tol: next(i for i, _ in enumerate(a) if np.isclose(_, val, tol))
i = FirstIndex(a, val, tol) # call it
这是一个矢量化的单线图-
(np.abs(a - val) <= tol).argmax()
(np.abs(a-val)您可以使用numpy.where
:
np.where(np.isclose(a, val, tol))
并且只需获取where
返回的最低索引(即第一个结果)
希望这有帮助。
< Po>!没有一个是健壮的。即使Divakar的答案如果没有最接近的值也会失败,你会得到索引=0,这是一个错误。在这种情况下它可能会返回“没有”。所以至少一个一行是不可能的。原来的问题不是很好的。你需要考虑,“…如果在公差范围内没有这样的接近值,该怎么办?”然后给出在这种情况下该怎么办的规范
i_array = np.where(np.isclose(a, val, tol))
这已经足够公平了,但是仍然需要处理一个空的结果。因此,我认为一行代码会很笨重,至少两行代码会更好:
i_array = np.where(np.isclose(a, val, tol))
my_i = None if (len(i_array[0])==0) else int(i_array[0])
这确实是一个比JoséSánchez和Divakar更有效的解决方案。看起来很有希望!我在我的解决方案中发布的示例上尝试了它,我得到了0
作为索引。我期望Pyton 3.5上的1
@Divakar,NumPy 1.8.0在运行OP代码时不会显示任何结果,但您的解决方案在给定exa的情况下返回0ct与您的答案中相同的数组…@Divakar,这是因为使用了不同的公式,即absolute(a-val)嗯,我想它会起作用,谢谢澄清!如果没有最接近的值,则会失败,因为它将返回0,这是错误的!如果没有最接近“val”的元素,则应返回“None”。
i_array = np.where(np.isclose(a, val, tol))
my_i = None if (len(i_array[0])==0) else int(i_array[0])