给定一个numpy数组:
x = np.array([False, True, True, False, False, False, False, False, True, False])
如何查找值从False转换为True的次数?对于上面的例子,答案是2.我不想在计数中包含从True到False的转换 .
从How do I identify sequences of values in a boolean array?的答案中,以下内容生成值即将更改的索引,这不是我想要的,因为这包括True-False转换 .
np.argwhere(np.diff(x)).squeeze()
# [0 2 7 8]
我知道这可以通过循环遍历数组来完成,但我想知道是否有更快的方法来做到这一点?
2 回答
获得一次性切片 -
x[:-1]
(从第一个elem开始,到第二个最后一个elem结束)和x[1:]
(从第二个elem开始直到结束),然后寻找第一个切片小于第二个切片,即 grab[False, True]
的模式,最后得到ndarray.sum()
或np.count_nonzero()
的计数 -另一种方法是寻找第一个切片
False
,第二个切片为True
,这个想法再次是为了捕捉[False, True]
的模式 -我有点喜欢使用numpy方法“roll”来解决这类问题......“roll”将数组旋转到左边一些步长:(-1,-2,...)或右边(1,2, ...)
...这会给x但向左移一步:
然后可以将False跟随True表示为: