如何用Python统计符合特定条件的上升循环峰值数量?
解决循环峰值统计问题
原代码的问题分析
- 分割逻辑错误:使用
np.split(cycle, np.where(np.diff(cycle) < 0)[0] + 1)会将每次数值下降的位置都切割数组,得到的子数组大多是循环的片段(比如仅上升阶段、仅下降阶段),并非完整的上升-下降循环。 - 条件判断完全偏离需求:
min(unit) > 0直接排除了所有下限小于5的情况(比如0、3这类符合要求的低点),导致目标循环被过滤。max(unit) < 25会包含大量峰值超过22的循环,错误统计了不符合要求的片段。
- 未定义完整循环:没有以“低点→峰值→低点”的完整周期作为判断单位,而是误将片段当成循环。
修正后的代码实现
以下代码基于“完整上升循环=从低点(<5)开始→上升到峰值→下降回到低点(<5)”的逻辑,严格匹配你的统计条件:
cycle = [0, 14, 9, 0, 0, 7, 0, 0, 12, 16, 15, 11, 7, 20, 24, 13, 13, 14, 19, 13, 12, 10, 7, 3, 3, 3, 25, 14, 14, 14, 7, 24, 20, 20, 21, 20, 20, 20, 20, 20, 21, 16, 11, 11, 18, 22, 22, 20, 19, 19, 18, 15, 20, 23, 21, 23, 24, 15, 16, 19, 25, 24, 0, 20, 23, 24, 23, 22, 21, 23, 25, 28, 24, 23, 23, 17, 7, 11, 21, 25, 25, 25, 25, 25, 25, 15, 13, 9, 0, 21, 10, 18, 25, 25, 26, 23, 25, 23, 25, 27, 25, 12, 0, 0, 0, 19, 22, 24, 25, 25, 24, 24, 23, 23, 16, 19, 23, 24, 24, 17, 8, 0, 9, 7, 11, 18, 20, 23, 23, 24, 25, 25, 25, 17, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 16, 0, 7, 14, 21, 26, 26, 27, 28, 27, 15, 25, 26, 25, 25, 25, 24, 25, 25, 24, 26, 26, 26, 23] valid_cycles = [] start_idx = 0 n = len(cycle) # 遍历数组,以<5的低点作为循环的起止标志 for i in range(1, n): # 当从非低点进入低点时,视为一个循环结束 if cycle[i] < 5 and cycle[i-1] >= 5: current_cycle = cycle[start_idx:i+1] cycle_min = min(current_cycle) cycle_max = max(current_cycle) # 匹配需求条件:下限<5,上限在21-22之间 if cycle_min < 5 and 21 <= cycle_max <= 22: valid_cycles.append(current_cycle) start_idx = i + 1 # 处理数组末尾的剩余片段 if start_idx < n: current_cycle = cycle[start_idx:] cycle_min = min(current_cycle) cycle_max = max(current_cycle) if cycle_min < 5 and 21 <= cycle_max <= 22: valid_cycles.append(current_cycle) # 输出结果 print(f"符合条件的循环数量:{len(valid_cycles)}") for idx, cyc in enumerate(valid_cycles): print(f"循环{idx+1}:{cyc}") print(f" 下限(最小值):{min(cyc)},上限(最大值):{max(cyc)}\n")
代码说明
- 循环识别逻辑:以数值从≥5降到<5的节点作为循环结束标志,确保每个子数组是完整的“低点→峰值→低点”循环。
- 条件匹配:严格检查两个核心条件:
- 循环的最小值(下限)小于5
- 循环的最大值(上限)处于21到22之间(包含21和22)
- 新手友好:纯Python实现,无需复杂的numpy分割逻辑,逻辑清晰易懂。
内容的提问来源于stack exchange,提问作者user20759431
相关产品推荐
相关产品推荐

