使用numpy查找数组中第一个元素的索引,该元素在公差范围内接近浮点数

hjqgdpho  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(94)

我需要找到数组中第一个元素的索引,它在给定的公差范围内接近浮点数。
我可以用一个for block来实现:

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函数的一行程序解决方案。
注意,我感兴趣的是接近valfirst 元素的索引,而不管a数组后面可能有更接近的元素。我发现的解决方案对 * 最近 * 值的索引感兴趣,无论它位于数组中的哪个位置。

pgpifvop

pgpifvop1#

这里有一行代码:

Index = next(i for i, _ in enumerate(a) if np.isclose(_, val, tol))

这是什么?
括号中的代码是一个 * 生成器表达式 next返回(您猜对了!)生成器将产生的下一个(在本例中, 第一个 *)值。如果没有下一个值,则会引发StopIteration异常。

优点

1.它不消耗内存,因为它不需要计算所有可能的值并存储它们。
1.它的速度很快,因为如果已经找到所需的值,它不会继续循环遍历数组。
1.如果找不到值,它将引发异常。
1.它可以很容易地变成一行程序函数:

FirstIndex = lambda a, val, tol: next(i for i, _ in enumerate(a) if np.isclose(_, val, tol))

i = FirstIndex(a, val, tol) # call it
mbzjlibv

mbzjlibv2#

可以使用numpy.where

np.where(np.isclose(a, val, tol))

并且仅获得最低索引(即,第一个结果),由where返回。
希望这对你有帮助。

jtoj6r0c

jtoj6r0c3#

这是一个向量化的一行程序

(np.abs(a - val) <= tol).argmax()

逐步运行示例-

In [57]: a
Out[57]: array([5, 3, 9, 6, 8, 3, 5, 1])

In [58]: val = 2

In [59]: tol = 2

In [60]: (np.abs(a - val) < tol) # Many might satisfy
Out[60]: array([False,True,False,False,False,True,False,True], dtype=bool)

In [61]: (np.abs(a - val) <= tol).argmax() # Choose the first one with argmax
Out[61]: 1
gopyfrb3

gopyfrb34#

来吧,伙计们!以上这些都不是强有力的。即使Divakar的答案失败,如果没有最接近的值,你会得到索引=0,这是一个错误。在这种情况下,它应该返回“None”。因此,至少一行程序是不可能的。原来的问题不是适定的。您需要考虑,“.如果在公差范围内没有这样接近的值怎么办?“然后给予在这种情况下该怎么做的具体说明。

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])

相关问题