Skip to main content
 首页 » 编程设计

python之如何对相同 bool 值的 block 进行分组

2025年05月04日13mayingbao

假设我有以下列表:

a = [True, True, True, False, False, False, False, True, True] 

如何通过仅返回 0、3、7 或像下面这样的分组来对它们进行最佳分组?

[True, True, True] 
[False, False, False, False] 
[True, True] 

背景:我试图在我的 NumPy 数组中找到稳定状态,虽然将导数设置为零是一个好的开始,但我仍然需要将数组分类为 block 。我认为这基本上归结为上述问题。

我查找了 NumPy 和 itertools(试图从问题 NumPy grouping using itertools.groupby performance 中得到解决方案)但我没有成功。我猜有人可能会使用 itertools.takewhile 和 filtfalse 的组合(请参阅文档 here ),但我在那里超出了我的深度。或者也许我只是想得太复杂了。

请您参考如下方法:

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

a_ext = np.r_[~a[0],a] 
out = np.flatnonzero(a_ext[:-1]!=a_ext[1:]) 

作为单行代码,我们可以使用 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]