如何找到numpy数组中更大的最近值?

mas*_*chu 6 python indexing numpy

我想获取numpy数组中最接近的值的索引,该索引大于我的搜索值.示例:findNearestAbove(np.array([0.,1.,1.4,2.]), 1.5)应返回3(索引为2).

我知道我可以得到最近的索引np.abs(a-value).argmin(),我发现它min(a[np.where(a-value >= 0.)[0]])返回所需的数组值.因此,np.where(a == min(a[np.where(a-value >= 0.)[0]]))[0]可能会给我所需的指数.然而,这看起来相当复杂,我担心它可能在多维数组的情况下破裂.有什么建议如何改善这个?

Jos*_*del 7

我相信你可以用np.searchsorted这个:

In [15]: np.searchsorted(a,[1.5,],side='right')[0]
Out[15]: 3
Run Code Online (Sandbox Code Playgroud)

假设a是按升序排列的.

这种方法也不适用于多维数组,但我不确定该用例在预期输出方面是如何工作的.如果你能举一个你想象的例子,我可能能够适应这个目的.

注意:您也可以np.digitize用于此目的,虽然它执行线性搜索而不是二进制搜索,因此对于某些输入大小,它可能比单调更慢searchsorted并且需要a单调:

In [25]: np.digitize([1.5,], a, right=True)[0]
Out[25]: 3
Run Code Online (Sandbox Code Playgroud)


Aka*_*all 6

这是一种方式(我假设最接近你的意思是价值而不是位置)

import numpy as np

def find_nearest_above(my_array, target):
    diff = my_array - target
    mask = np.ma.less_equal(diff, 0)
    # We need to mask the negative differences and zero
    # since we are looking for values above
    if np.all(mask):
        return None # returns None if target is greater than any value
    masked_diff = np.ma.masked_array(diff, mask)
    return masked_diff.argmin()
Run Code Online (Sandbox Code Playgroud)

结果:

>>> find_nearest_above(np.array([0.,1.,1.4,2.]), 1.5)
3
>>> find_nearest_above(np.array([0.,1.,1.4,-2.]), -1.5)
0
>>> find_nearest_above(np.array([0., 1, 1.4, 2]), 3)
>>> 
Run Code Online (Sandbox Code Playgroud)