Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy查找数组中第一个元素的索引,该索引接近公差范围内的浮点值_Python_Arrays_Numpy - Fatal编程技术网

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

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

我需要找到数组中第一个元素的索引,它接近给定容差内的浮点值

我可以使用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):
        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])