如何沿指定轴统计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
相关产品推荐
相关产品推荐

