我想获取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]
可能会给我所需的索引。然而,这看起来相当复杂,我担心它可能在多维数组的情况下破裂。有任何建议如何改善吗?
答案 0 :(得分:7)
我相信您可以使用np.searchsorted
:
In [15]: np.searchsorted(a,[1.5,],side='right')[0]
Out[15]: 3
假设a
按升序排列。
此方法也不适用于多维数组,但我不确定该用例在预期输出方面是如何工作的。如果你能举一个你想象的例子,我或许可以适应这个目的。
注意:你也可以使用np.digitize
来实现这个目的,虽然它执行线性而不是二进制搜索,所以对于某些输入大小,它可能比{慢很多} {1}}并要求searchsorted
是单调的:
a
答案 1 :(得分: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()
结果:
>>> 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)
>>>
答案 2 :(得分:0)
这是一个解决方案,当找到数组中最接近但大于数字的值和索引(在速度方面没有承诺等)时,它非常适合我:
def findNearestGreaterThan(searchVal, inputData):
diff = inputData - searchVal
diff[diff<0] = np.inf
idx = diff.argmin()
return idx, inputData[idx]
它很容易适应最近但不到的地方:
def findNearestLessThan(searchVal, inputData):
diff = inputData - searchVal
diff[diff>0] = -np.inf
idx = diff.argmax()
return idx, inputData[idx]
答案 3 :(得分:-3)
这是执行此操作的正确方式:
>>> def argfind(array, predicate):
... for i in xrange(array.shape[0]):
... if predicate(array[i]):
... return i
... return False
...
>>> def find_nearest_above(array, value):
... return argfind(array, lambda x: x > value)
...
>>> find_nearest_above(np.array([0.,1.,1.4,2.]), 1.5)
> 3
这里的要点是,如果存在匹配值,您将在满足此值时得到答案。其他方法(包括你自己的方法,在问题中提出)将检查整个阵列,这是浪费时间。