【问题标题】:Finding False-True transitions in a numpy array在 numpy 数组中查找 False-True 转换
【发布时间】:2018-05-24 20:07:12
【问题描述】:

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

我知道这可以通过遍历数组来完成,但是我想知道是否有更快的方法来做到这一点?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    我有点喜欢使用 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)
    

    【讨论】:

      【解决方案2】:

      获取一次性切片 - x[:-1](从第一个元素开始,到倒数第二个元素结束)和x[1:](从第二个元素开始,一直持续到最后),然后寻找第一个切片小于第二个,即捕捉[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:])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        • 1970-01-01
        • 2017-12-23
        • 2019-08-27
        • 2020-07-06
        • 1970-01-01
        相关资源
        最近更新 更多