您可以使用以下方法找到值变化的位置np.diff
,不需要运行更复杂的算法,或者使用numba
:
positions = np.array([True, False, False, False, True, True, True, True, False, False, False], dtype=np.bool)
dpos = np.diff(positions)
# array([ True, False, False, True, False, False, False, True, False, False])
这有效,因为False - True == -1
and np.bool(-1) == True
.
它在我的电池供电(=由于节能模式而节流)和几年前的笔记本电脑上表现得很好:
In [52]: positions = np.random.randint(0, 2, size=300_000, dtype=bool)
In [53]: %timeit np.diff(positions)
633 µs ± 4.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
我想象写你自己的差异numba
应该产生类似的性能。
编辑:最后一个语句是错误的,我使用实现了一个简单的 diff 函数numba
,并且比速度快 10 倍以上numpy
一个(但它的功能显然也少得多,但对于这项任务来说应该足够了):
@numba.njit
def ndiff(x):
s = x.size - 1
r = np.empty(s, dtype=x.dtype)
for i in range(s):
r[i] = x[i+1] - x[i]
return r
In [68]: np.all(ndiff(positions) == np.diff(positions))
Out[68]: True
In [69]: %timeit ndiff(positions)
46 µs ± 138 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)