繁体   English   中英

Python:检查区间数所在的最快方法

[英]Python: fastest way to check in which interval number is in

假设我已将区间[0, 1]拆分为一系列较小的区间[0, 0.2), [0.2, 0.4), [0.4, 0.9), [0.9, 1.0] 现在我在[0, 1]中采样一个值r 我可以使用 Python / Numpy / Pytorch 检查属于哪个区间的最快方法是什么?

显而易见的方法是这样的:

r = np.random.rand()
if 0 <= r < 0.2:
    pass # do something
elif 0.2 <= r < 0.4:
    pass # do something else
elif 0.4 <= r < 0.9:
    pass # do yet something else again
elif 0.9 <= r <= 1.0:
    pass # do some other thing


bisect模块包含一个 function bisect ,它使用二等分算法来索引排序列表。 这应该大约是O(log n)

from bisect import bisect

您可以将最右边的间隔值保存在一个列表中,以及一个以相同顺序执行适当操作的函数列表。 例如

def a():
    print("Do something")


intervals = [0.2, 0.4, 0.9, 1]

stufftodo = [a, a, a, a]

当然,您可以为每个区间设置不同的函数。 然后,您可以使用 bisect 返回的索引来索引stufftodo ,提取适当的 function 并调用它。

r = np.random.rand()
stufftodo[bisect(intervals, r)]()

您首先需要将区间列表转换为边界列表,因此您只需定义许多区间[0, 0.2), [0.2, 0.4), [0.4, 0.9), [0.9, 1.0] ,而不是许多区间:

boundaries = [0, 0.2, 0.4, 0.9, 1.0]  # values must be sorted!!

然后您可以对所有这些执行二进制搜索,以查看value属于哪个段:

index = bisect.bisect_right(boundaries, value)

index将是上限的索引,因此要获取范围,您需要:

range_low = boundaries[index - 1] if index > 0 else None
range_high = boundaries[index] if index < len(boundaries) else None

这还将负责处理不在任何间隔中的值。 二进制搜索将在log(N)比较中完成,这是理论上你可以对任意间隔做的最好的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM