Python如何实现同时满足数值阈值和连续序列阈值的数据点分类
Python实现连续阈值标记方案
核心思路
- 首先遍历输入数据,识别所有连续满足「数值超过阈值」的区间
- 逐一判断每个连续区间的长度是否满足序列阈值要求,仅对符合要求的区间标记为1,其余位置默认标记为0
基础实现代码(纯Python,无依赖)
def label_continuous_above_threshold(data, value_threshold, seq_threshold): n = len(data) result = [0] * n current_start = None for idx, val in enumerate(data): if val > value_threshold: if current_start is None: current_start = idx else: # 连续区间结束,判断是否满足序列长度要求 if current_start is not None: seq_length = idx - current_start if seq_length > seq_threshold: result[current_start:idx] = [1] * seq_length current_start = None # 处理数组末尾剩余的连续区间 if current_start is not None: seq_length = n - current_start if seq_length > seq_threshold: result[current_start:] = [1] * seq_length return result
示例测试
# 示例参数 test_data = [5,5,1,1,1,5,5,5,4,4,4,4,5,5,5,5,5] value_thresh = 4 seq_thresh = 2 output = label_continuous_above_threshold(test_data, value_thresh, seq_thresh) print(output)
运行输出与预期一致:
[0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]
大数据量优化版本(基于NumPy)
如果处理的数据量很大(超过10万条),可以用NumPy向量化运算提升效率:
import numpy as np def label_continuous_above_threshold_np(data, value_threshold, seq_threshold): data_arr = np.array(data) mask = data_arr > value_threshold # 识别连续区间的起止位置 diff = np.diff(np.concatenate(([0], mask, [0]))) starts = np.where(diff == 1)[0] ends = np.where(diff == -1)[0] # 筛选符合长度要求的区间 valid_mask = (ends - starts) > seq_threshold result = np.zeros_like(data_arr, dtype=int) for s, e in zip(starts[valid_mask], ends[valid_mask]): result[s:e] = 1 return result.tolist()
内容的提问来源于stack exchange,提问作者Cole Hagen
相关产品推荐
相关产品推荐

