在numpy数组中查找False-True转换

时间:2017-12-11 10:14:34

标签: python numpy

给定一个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?的答案中,下面会生成值即将发生变化的索引,这不是我想要的,因为这包括真假过渡。

np.argwhere(np.diff(x)).squeeze()
# [0 2 7 8]

我知道这可以通过循环遍历数组来完成,但是我想知道是否有更快的方法来执行此操作?

2 个答案:

答案 0 :(得分:8)

获得一次性切片 - x[:-1](从第一个elem开始,到第二个elem结束)和x[1:](从第二个elem开始直到结束),然后寻找第一个切片小于第二个切片,即抓住[False, True]的模式,最后得到ndarray.sum()np.count_nonzero()的计数 -

(x[:-1] < x[1:]).sum()
np.count_nonzero(x[:-1] < x[1:])

另一种方法是寻找第一个切片为False而第二个切片为True,这个想法再次是为了捕捉[False, True] -

的模式
(~x[:-1] & x[1:]).sum()
np.count_nonzero(~x[:-1] & x[1:])

答案 1 :(得分:0)

对于这种问题,我有点喜欢使用numpy方法“ roll” ... “ roll”旋转数组,使数组向左旋转一些步长:(-1,-2,...)或向右旋转(1,2,...)

import numpy as np
np.roll(x,-1)

...这将给x,但向左移动了一步:

array([ True,  True, False, False, False, False, False,  True, False, False], 
dtype=bool)

随后为True的False可以表示为:

~x & np.roll(x,-1)

array([ True, False, False, False, False, False, False,  True, False, False], 
dtype=bool)