统计一维NumPy数组中连续零构成的间隙数量
统计一维NumPy数组中连续零值构成的间隙数量
计数规则
- 数组中连续出现的零值序列整体计为1个间隙,被非零值分隔开的多段零序列分别独立计数。
待统计示例数组
import numpy as np array = np.array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 2458, 2458, 2458, 2458, 2458, 2458, 2458, 0, 0, 0, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 0, 0, 0, 0, 5431, 5431, 5431, 5431, 5431, 5431, 5431, 0, 0, 0, 0, 0, 0, 0, 0, 0])
该示例数组共包含4个符合规则的间隙,预期程序输出结果为4。
实现方案
采用NumPy向量化操作实现,无Python层循环,处理大数组时执行效率很高,核心逻辑是统计所有零值段的起始位置总数:
def count_zero_gaps(arr): is_zero = arr == 0 # 数组起始位置前默认视为非零,识别所有从非零跳变到零的位置 gap_start_flags = np.diff(is_zero.astype(np.int8), prepend=0) == 1 return gap_start_flags.sum()
测试验证
print(count_zero_gaps(array))
执行后输出:
4
逻辑说明
- 第一步先把数组转换为布尔数组,对应位置为
True表示元素是0,False表示非零 - 给布尔数组头部补一个0(模拟数组开头前的非零状态),计算相邻元素的差值:当差值为1时,代表当前位置从非零变为零,也就是一个新间隙的起点
- 统计所有起点的数量,就是最终的间隙总数,自动兼容数组开头/结尾为零的边界场景,不会漏算多算。
内容的提问来源于stack exchange,提问作者Jannes
相关产品推荐
相关产品推荐

