如何对相同布尔值的块进行分组?

Eul*_*sel 3 python numpy python-itertools

假设我有以下列表:

a = [True, True, True, False, False, False, False, True, True]
Run Code Online (Sandbox Code Playgroud)

怎样才能让他们最好只要么返回分组0,3,7或分组像下面这样?

[True, True, True]
[False, False, False, False]
[True, True]
Run Code Online (Sandbox Code Playgroud)

背景:我试图在我的 NumPy 数组中找到平台,虽然将导数设置为零是一个好的开始,但我仍然需要将数组排序为块。我认为这基本上归结为上述问题。

我查找了 NumPy 和 itertools(试图从问题NumPy grouping using itertools.groupby performance 中获得解决方案)但我没有成功。我想人们可能会使用itertools.takewhile和 filtfalse的组合(请参阅此处的文档),但我对此并不了解。或者也许我只是想得太复杂了。

Div*_*kar 5

我们可以通过切片数组比较来获得索引,并且对于大尺寸列表/数组的性能应该很好 -

a_ext = np.r_[~a[0],a]
out = np.flatnonzero(a_ext[:-1]!=a_ext[1:])
Run Code Online (Sandbox Code Playgroud)

作为单线,我们可以使用np.diff+ np.flatnonzero-

np.flatnonzero(np.diff(np.r_[~a[0],a]))
# compact alternative : np.where(np.diff(np.r_[~a[0],a]))[0]
Run Code Online (Sandbox Code Playgroud)