如何判断数组中是否存在长度为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)
逻辑说明
np.diff(arr) == 0:快速得到所有相邻元素相等的位置,替代循环判断,是向量化的核心步骤。- 前后补
False:解决数组首尾出现连续重复序列的边界问题,让所有连续相等区间都能被统一识别。 - 计算连续长度:每个连续相等的元素序列,对应
equal_adjacent中连续的True,其长度为True的数量+1(每个True对应一对相邻相等元素)。 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
相关产品推荐
相关产品推荐

