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

如何判断数组中是否存在长度为N的连续重复元素序列

检查NumPy数组中是否存在连续重复N次的元素(向量化实现)

这里提供两种高效的向量化方案,避免迭代式滑动窗口,充分利用NumPy的广播和数组操作特性:

方案一:基于连续区间统计

通过定位相邻相等元素的连续区间,计算区间长度判断是否存在符合要求的序列:

import numpy as np

def has_consecutive_duplicates(arr, n):
    if n == 1:
        return True
    if len(arr) < n:
        return False
    
    # 生成相邻元素相等的布尔数组
    equal_adjacent = np.diff(arr) == 0
    # 前后补False,统一处理首尾的连续序列
    padded = np.concatenate([[False], equal_adjacent, [False]])
    
    # 定位连续相等区间的起始和结束位置
    start_indices = np.where(padded[1:] & ~padded[:-1])[0]
    end_indices = np.where(~padded[1:] & padded[:-1])[0]
    
    # 计算每个连续区间对应的元素重复长度(连续True的数量+1)
    consecutive_lengths = end_indices - start_indices + 1
    
    # 检查是否存在长度≥N的连续序列
    return np.any(consecutive_lengths >= n)

逻辑说明

  1. np.diff(arr) == 0:快速得到所有相邻元素相等的位置,替代循环判断,是向量化的核心步骤。
  2. 前后补False:解决数组首尾出现连续重复序列的边界问题,让所有连续相等区间都能被统一识别。
  3. 计算连续长度:每个连续相等的元素序列,对应equal_adjacent中连续的True,其长度为True的数量+1(每个True对应一对相邻相等元素)。
  4. np.any:向量化判断是否存在满足长度要求的序列,效率远高于循环遍历。

方案二:基于卷积的滑动窗口检查

利用卷积操作快速检测连续n-1个相邻相等的情况(对应n个连续重复元素):

import numpy as np

def has_consecutive_duplicates_v2(arr, n):
    if n == 1:
        return True
    if len(arr) < n:
        return False
    
    equal_adjacent = np.diff(arr) == 0
    # 用卷积计算滑动窗口内连续相等的次数
    # 窗口大小为n-1,当窗口内全为True时,求和结果为n-1
    consecutive_matches = np.convolve(equal_adjacent.astype(int), np.ones(n-1, dtype=int), mode='valid')
    
    return np.any(consecutive_matches == n-1)

逻辑说明

  • 连续n个重复元素对应n-1个连续的True(在equal_adjacent数组中)。
  • 卷积操作对equal_adjacent进行滑动窗口求和,当窗口内求和结果等于n-1时,说明窗口内全是True,即存在连续n个重复元素。
  • 该方法代码更简洁,完全向量化,适合处理大规模数组。

测试示例

# 测试数组
test_arr = np.array([1,2,3,4,4,4,4,5,6,7])

print(has_consecutive_duplicates(test_arr, 4))   # 输出:True
print(has_consecutive_duplicates(test_arr, 5))   # 输出:False
print(has_consecutive_duplicates_v2(test_arr, 4))# 输出:True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:15:24