假设我有以下列表:
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]
