You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何沿指定轴统计numpy数组中连续True的块数?

问题描述

给定如下NumPy布尔数组:

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]])

需要沿列统计连续True的块数,示例中第一列有3个连续True块,第二列有2个,第三列有2个,期望输出为:

array([3, 2, 2])

已知可以通过循环逐列处理(复用一维数组的解决方案),但如何用NumPy原生方法直接处理二维数组?

NumPy原生方法实现

可以利用NumPy的向量化操作,通过检测True块的起始点来统计数量,核心思路是:

  • 在数组顶部添加一行全False,捕捉第一行就出现True的情况
  • 对比原数组和上移一行的数组,找出从False变为True的位置(即连续True块的起始)
  • 对每列的起始点数量求和,得到该列的连续True块数

具体代码如下:

import numpy as np

# 示例输入数组
arr = 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]])

# 在数组顶部添加一行全False
padded = np.vstack([np.zeros(arr.shape[1], dtype=bool), arr])
# 计算从False到True的转变点:当前为True且上一行是False
transitions = np.logical_and(padded[1:], ~padded[:-1])
# 对每列求和,得到每列的连续True块数
result = transitions.sum(axis=0)

print(result)
# 输出:array([3, 2, 2])

原理说明

  • 顶部添加全False行是为了处理数组第一行就出现True的场景,保证第一个True会被识别为有效起始点
  • transitions数组中的每个True都对应一个连续True块的起始位置,对列求和即可得到该列的块数
  • 整个过程基于NumPy向量化操作,无显式循环,效率远高于逐列循环处理

内容的提问来源于stack exchange,提问作者TTY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 04:09:58