【发布时间】:2017-11-02 09:03:05
【问题描述】:
我正在尝试编写一个 Python 程序,该程序使用来自眼动追踪设备的输入数据并检查它是否在给定范围内。输入是一个归一化值,对应于注视的 x 位置。范围总是预先排序的。我需要检查这个位置 x 是否在二维数组中任何一对元素的边界内,如果是这样,就运行一个函数。比如:
x = 0.23 # input variable
boundaries = [[0.0, 0.025], [0.025, 0.1], [0.1, 0.14], [0.15, 0.25]]
for i, pair in enumerate(boundaries):
if x >= pair[0] and x <= pair[1]:
print(i) # some function
现在,问题是输入 x 是以 60Hz 发出的实时数据,边界有时可能是长列表(1000 个元素),因此使用这种方法每秒将进行数十万次检查。进行此计算的最有效方法是什么?我想也许在 numpy 中有一个很好的矢量化版本,但我在微积分方面相当糟糕。
我已经进行了测试,以确定@Meitham 在答案中发布的解决方案是否给我带来了明显的差异,但是我使用 Python 方法获得了:
import numpy as np
n = 10000
b1 = np.linspace(0.0, 1.0, n)
boundaries = [[b1[i], b1[i] + 0.01] for i in range(n)]
x = 0.23
final = []
for i, pair in enumerate(boundaries):
if x >= pair[0] and x <= pair[1]:
final.append(pair)
100000000 loops, best of 3: 0.0121 usec per loop
还有 numpy 方法:
import numpy as np
n = 10000
b1 = np.linspace(0.0, 1.0, n)
boundaries = [[b1[i], b1[i] + 0.01] for i in range(n)]
x = 0.23
a = np.array(boundaries)
final = a[(a[...,0] < x) & (a[...,1] > x)]
100000000 loops, best of 3: 0.0122 usec per loop
所以我认为这两种方法之间没有任何有意义的区别。也许我以错误的方式测试它?
【问题讨论】:
-
这些边界元组是否总是排序的,即 [(x, y)...] 其中总是 x
-
@Darien,你能澄清一下边界是如何排列的吗?对可以相交吗?从您的示例中,Yn
-
@Meitham,是的,他们总是满足条件 x
-
@IgorKleinerman。边界对 [(x,y), ...] 始终是起点和终点,其中 x != y 始终为真,实际上 Yn
-
@Meitham,对不起,我不能再编辑了。它们确实总是排序的,但总是 x != y,所以 (x