我想找到小于目标值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
。有人对如何执行此操作有想法吗?
答案 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()
如果n
与A[0]
相同,则甚至需要以下内容进行附加检查-
A[:np.searchsorted(A,n)].argmax()