python - 在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 函数来做到这一点。谢谢!
解决方案
既然你提到了 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。最后,由于好像它是按其他方式排序的那样工作,我们通过从最后的长度中减去它来纠正位置。sorter
searchsorted
searchsorted
此外,当数组中没有元素大于限制时,它返回 -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
推荐阅读
- powershell - 如何在Powershell中删除回车?
- arrays - 使用 React 在列表中呈现列表
- c# - ListView中的TimePicker更改值后再次弹出时间选择界面
- java - (JAVA、Elasticsearch)如何从 SearchResponse 中获取字段?
- vagrant - Laravel 宅基地存储链接 wot 工作
- android - TensorFlow Lite:使用 Mobilenet_V2 进行批处理
- c++ - 在 Xcode 10 中检测命令行程序 c++ 中的内存泄漏
- c# - 如何在 xamarin.android 中检查查看空条件
- c# - 列表中的 string.StartsWith 元素
- caching - 如何在 Mvc 之前通过中间件设置 Cache-Headers 并且不被 ResponseCacheAttribute 覆盖?