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

hjqgdpho  于 2023-10-19  发布在  其他
关注(0)|答案(4)|浏览(168)

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

  1. import numpy as np
  2. # Define array of floats
  3. a = np.random.uniform(0., 10., 10.)
  4. # Float to search, and tolerance.
  5. val, tol = 6.87, 0.1
  6. for i, _ in enumerate(a):
  7. if np.isclose(_, val, tol):
  8. print('Index is: {}'.format(i))
  9. break

但是我想知道是否有一个使用numpy函数的一行程序解决方案。
注意,我感兴趣的是接近valfirst 元素的索引,而不管a数组后面可能有更接近的元素。我发现的解决方案对 * 最近 * 值的索引感兴趣,无论它位于数组中的哪个位置。

pgpifvop

pgpifvop1#

这里有一行代码:

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

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

优点

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

  1. FirstIndex = lambda a, val, tol: next(i for i, _ in enumerate(a) if np.isclose(_, val, tol))
  2. i = FirstIndex(a, val, tol) # call it
展开查看全部
mbzjlibv

mbzjlibv2#

可以使用numpy.where

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

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

jtoj6r0c

jtoj6r0c3#

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

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

逐步运行示例-

  1. In [57]: a
  2. Out[57]: array([5, 3, 9, 6, 8, 3, 5, 1])
  3. In [58]: val = 2
  4. In [59]: tol = 2
  5. In [60]: (np.abs(a - val) < tol) # Many might satisfy
  6. Out[60]: array([False,True,False,False,False,True,False,True], dtype=bool)
  7. In [61]: (np.abs(a - val) <= tol).argmax() # Choose the first one with argmax
  8. Out[61]: 1
展开查看全部
gopyfrb3

gopyfrb34#

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

  1. i_array = np.where(np.isclose(a, val, tol))

这是公平的,但仍然需要处理一个空的结果。所以,我想说一行程序会很笨重,至少两行程序更好:

  1. i_array = np.where(np.isclose(a, val, tol))
  2. my_i = None if (len(i_array[0])==0) else int(i_array[0])

相关问题