首页 > 解决方案 > 在python中过滤具有定义阈值的排序数组

问题描述

例如,我有一个排序列表x = [120, 99, 90, 90, 40, 5, 5, 5, 1, 1]。我想找到大于变量的最后一个元素的索引,例如limit = 30. 在这个例子中,我想得到 4,因为那是 40 的索引(而 5 低于 30)。我怎样才能在python中有效地做到这一点?我可以像这样循环:

def filtering(x, limit):
    for i,elem in enumerate(x):
       if elem <=limit:
          return i-1
    return i
   

但我在想是否有更好的方法/ numpy 函数来做到这一点。谢谢!

标签: pythonnumpy

解决方案


既然你提到了 NumPy:

def last_ind(arr, limit):
    length = len(arr)
    sorter = np.arange(length)[::-1]
    pos = np.searchsorted(arr, limit, sorter=sorter)
    return length - pos - 1

由于查找按升序searchsorted排序的数组,但您的数组按降序排序,因此我们将列表的索引反向传递给它。此外,是否会发现,但它会返回您放置新号码的索引;但是,您需要前一个元素的索引,因此需要-1。最后,由于好像它是按其他方式排序的那样工作,我们通过从最后的长度中减去它来纠正位置。sortersearchsortedsearchsorted

此外,当数组中没有元素大于限制时,它返回 -1。

样品运行:

>>> x
[120, 99, 90, 90, 40, 5, 5, 5, 1, 1]

>>> last_ind(x, 30)
4

>>> last_ind(x, 100)
0

>>> last_ind(x, 92)
1

>>> last_ind(x, 90)
3

>>> last_ind(x, 3)
7

>>> last_ind(x, 500)
-1

>>> last_ind(x, -51)
9

推荐阅读