实际上,这是一种 numpy 方式,它应该比使用itertools
或手动循环更快:
>>> a = np.array([True, True, True, True, False, False, False, True, True, True, True, True])
>>> np.diff(a)
array([False, False, False, True, False, False, True, False, False,
False, False], dtype=bool)
>>> _.nonzero()
(array([3, 6]),)
正如您在评论中提到的那样,熊猫groupby
也可以。
说服@poke 这是值得的时机:
>>> %%timeit a = np.random.randint(2, size=1000000)
... np.diff(a).nonzero()
...
100 loops, best of 3: 12.2 ms per loop
>>> def cluster_changes(array):
... changes = []
... last = None
... for i, elt in enumerate(array):
... if elt != last:
... last = elt
... changes.append(i)
... return changes
...
>>> %%timeit a = np.random.randint(2, size=1000000)
cluster_changes(a)
...
1 loops, best of 3: 348 ms per loop
与 7 行手动功能相比,使用单行的该阵列是 30 倍。(当然,这里的数据比 OP 的数据有更多的集群变化,但这并不能弥补这么大的差异。)