给定一个numpy数组:
x = np.array([False, True, True, False, False, False, False, False, True, False])
Run Code Online (Sandbox Code Playgroud)
如何查找值从False转换为True的次数?对于上面的例子,答案是2.我不想在计数中包含从True到False的转换.
从答案我如何识别布尔数组中的值序列?,以下产生值即将改变的索引,这不是我想要的,因为这包括True-False转换.
np.argwhere(np.diff(x)).squeeze()
# [0 2 7 8]
Run Code Online (Sandbox Code Playgroud)
我知道这可以通过循环遍历数组来完成,但我想知道是否有更快的方法来做到这一点?
得到一次性切片 - 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:])
Run Code Online (Sandbox Code Playgroud)
另一种方法是寻找第一个切片False和第二个切片True,这个想法再次是为了捕捉这种模式[False, True]-
(~x[:-1] & x[1:]).sum()
np.count_nonzero(~x[:-1] & x[1:])
Run Code Online (Sandbox Code Playgroud)