查找小于数组中目标的最大元素的首次出现

时间:2019-12-10 13:23:20

标签: python arrays numpy sorting

我想找到小于目标值n的数组中最大元素的首次出现的索引。我将举例说明一下。假设我有这个numpy数组:

import numpy as np
A = np.array([0.1, 0.2, 0.4, 0.4, 0.7, 0.7, 0.7, 1])

如果我设置了目标n = 0.5,那么我想获得两个0.4之间的最低索引,这两个索引都是数组中的最高元素,其大小小于{{1} }。因此,在这种情况下,返回的索引应为n。如果我设置了2,那么返回的索引应该是n = 0.9,它是4的最低索引,依此类推...

我当然可以使用0.7循环来做到这一点,但是我正在寻找一种快速且易读的pythonic解决方案。到目前为止,我尝试的是基于for的方法,但是它们并不能按我的意愿工作。例如:

np.argmin(np.unique(A)<n) -1

正确返回np.argmin(np.unique(A)<0.5) - 1 ,但是

2

返回np.argmin(np.unique(A)<0.9) - 1 ,因为它没有计算3已“压缩”的两次0.4。有人对如何执行此操作有想法吗?

1 个答案:

答案 0 :(得分:2)

带有np.nanargmax + np.where的单线-

In [175]: np.nanargmax(np.where(A<n,A,np.nan))
Out[175]: 2

如果n为正,则为另一个-

In [180]: (A*(A<n)).argmax()
Out[180]: 2

另一个与np.flatnonzero-

In [114]: idx = np.flatnonzero(A<n)

In [115]: idx[A[idx].argmax()]
Out[115]: 2

另一个使用更多遮罩的方式可以提高内存效率-

def argmax_lesser_than_thresh(a, n):
    m = A<n
    m2 = m.copy()
    s = np.ones(m.sum(), dtype=bool)
    s[A[m].argmax()] = False
    m2[m] = s
    return (m2!=m).argmax()

如评论中所述,如果输入数组是排序数组,我们也可以使用np.searchsorted,就像这样-

(A==A[max(0,np.searchsorted(A,n)-1)]).argmax()

如果nA[0]相同,则甚至需要以下内容进行附加检查-

A[:np.searchsorted(A,n)].argmax()