首页 文章

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

提问于
浏览
5

给定一个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 回答

  • 8

    获得一次性切片 - x[:-1] (从第一个elem开始,到第二个最后一个elem结束)和 x[1:] (从第二个elem开始直到结束),然后寻找第一个切片小于第二个切片,即 grab [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:])
    
  • 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)
    

    然后可以将False跟随True表示为:

    ~x & np.roll(x,-1)
    
    array([ True, False, False, False, False, False, False,  True, False, False], 
    dtype=bool)
    

相关问题