我有一个如下所示的列表:
# Ordered list.
a = [0.1, 0.3, 0.4, 0.5, 0.6, 0.7, 0.9]
我需要遍历一个看起来像这样的浮动列表:
# Not ordered list.
b = [0.12, 0.53, 0.30, 0.03, 0.77, 0.62, 0.98, 0.01, 0.42, 0.33, 1.3]
检查列表a
中列表b
中每个元素的哪些元素落在哪个元素中,并返回a
(右侧)中元素的索引。例如,对于上面的列表b
,结果将如下所示:
indxs = [1, 4, 2, 0, 6, 5, 7, 0, 3, 2, 7]
(注意指向与a
相关联的> max(a)
中的额外元素的索引7)
我可以使用如下所示的相当精细的for/if
循环执行此操作,但我想知道是否可能有更简单的方法来处理我可能不知道的某些函数(numpy
/ {{ 1}}函数欢迎)
MWE:
scipy
答案 0 :(得分:8)
普通的Python解决方案是bisect
模块,它有binary search的几个函数:
>>> [bisect.bisect(a, x) for x in b]
[1, 4, 2, 0, 6, 5, 7, 0, 3, 2, 7]
NumPy解决方案是numpy.searchsorted
,它的功能大致相同:
>>> numpy.searchsorted(a, b, side='right')
array([1, 4, 2, 0, 6, 5, 7, 0, 3, 2, 7], dtype=int64)
答案 1 :(得分:1)
这是一个表达式:
where(b<=a.max(),argmax((b[:,None] - a) < 0,axis=1),len(a))
(如果a和b是数组)