gpt4 book ai didi

python - 检查某个值属于哪个区间索引的最快方法

转载 作者:行者123 更新时间:2023-12-02 01:37:27 26 4
gpt4 key购买 nike

我有一个像这样的向量:

intervals = [6, 7, 8, 9, 10, 11] #always regular

我想检查一个值是哪个区间索引。例如:8.5所在区间的索引为3

#Interval : index
6 -> 7 : 1
7 -> 8 : 2
8 -> 9 : 3
9 -> 10 : 4
10 -> 11 : 5

所以我编写了这段代码:

from numpy import *
N = 8000
data = random.random(N)
step_number = 50
max_value = max(data)
min_value = min(data)
step_length = (max_value - min_value)/step_number
intervals = arange(min_value + step_length, max_value + step_length, step_length )
for x in data:
for index in range(len(intervals)):
if x < intervals[index]:
print("That's the index", index)
break

这段代码可以工作,但是太慢了,我想我在这些循环中浪费了时间。有没有办法更快地检查这个?也许使用一些 numpy 特殊函数来为我检查这个......

最佳答案

根据您想要如何处理端点,有 bisect.bisect_leftbisect.bisect_right:

>>> import bisect
>>> intervals = [6, 7, 8, 9, 10, 11]
>>> for n in (6, 6.1, 6.2, 6.5, 6.8, 7):
... print bisect.bisect_left(intervals, n)
...
0
1
1
1
1
1
>>> for n in (6, 6.1, 6.2, 6.5, 6.8, 7):
... print bisect.bisect_right(intervals, n)
...
1
1
1
1
1
2

Numpy 使用 searchsorted 实现相同的功能方法。

>>> import numpy as np
>>> np.searchsorted(intervals, (6, 6.1, 6.2, 6.5, 6.8, 7), side='left')
array([0, 1, 1, 1, 1, 1])
>>> np.searchsorted(intervals, (6, 6.1, 6.2, 6.5, 6.8, 7), side='right')
array([1, 1, 1, 1, 1, 2])

当然,如果你的间隔是等距的,你可以这样做:

>>> for n in (6, 6.1, 6.2, 6.5, 6.8, 7):
... iwidth = intervals[1] - intervals[0]
... print np.ceil((n - intervals[0]) / iwidth)
...
0.0
1.0
1.0
1.0
1.0
1.0

关于python - 检查某个值属于哪个区间索引的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34798343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com