代码之家  ›  专栏  ›  技术社区  ›  TTY

如何计算numpy数组中沿给定轴的连续Trues数?

  •  0
  • TTY  · 技术社区  · 3 年前

    例如,我有以下np数组

    array([[ True, False, False],
           [False,  True,  True],
           [ True,  True,  True],
           [False,  True,  True],
           [False,  True,  True],
           [ True, False, False],
           [ True,  True, False],
           [False, False,  True]])
    

    我想计算沿着列的连续Trues的数量,所以在上面的例子中,第一列包含3个连续Trues块,第二列包含2个块,第三列包含两个块。然后输出应该是

    array([3, 2, 2])
    

    我知道我可以为每列做循环,就像这样 answer 对于一维数组,但是在二维数组上执行此操作的numpy方法是什么?

    1 回复  |  直到 3 年前
        1
  •  1
  •   mozway    3 年前

    使用布尔运算来识别 True 后面没有 真的 (使用切片和 pad ),那么 sum 这个 真的 每列:

    out = ((a != np.pad(a[1:], ((0,1), (0,0)), constant_values=False))
           & a).sum(axis=0)
    

    或者:

    out = (a & ~np.pad(a[1:], ((0,1), (0,0)), constant_values=False)).sum(axis=0)
    

    输出:

    array([3, 2, 2])
    
        2
  •  1
  •   Alain T.    3 年前

    可以通过沿第一个轴将元素与其后续元素进行比较,并将从False到True的转换添加到第一行的True值来完成此操作:

    A[0,:] + (A[:-1,:]<A[1:,:]).sum(axis=0)
    
        3
  •  0
  •   Tyler2P Suraj Mandal    3 年前
    def count_consecutive_trues(arr, axis):
            consecutive_counts = []
            for row in arr:
                    count = 0
                    max_count = 0
                    for value in row:
                            if value:
                                    count += 1
                                    max_count = max(max_count, count)
                            else:
                                    count = 0
                    consecutive_counts.append(max_count)
            return consecutive_counts