如何简便计算数据集反转点对应的从0起始的递增计数序列
实现方法
核心逻辑是先定位所有趋势反转(拐点)位置,再通过累计求和得到计数序列,全程用numpy向量化操作,无显式循环,简单高效。
步骤说明
- 计算序列相邻元素的差值,取差值的符号(上升为1、下降为-1、持平为0)
- 对比相邻两个步长的符号,符号不一致的中间点即为反转点
- 初始化全0计数数组,在反转点位置标记1,最后做累计求和即可得到目标计数序列
完整可运行代码
import numpy as np import matplotlib.pyplot as plt db = np.array([12, 0, 6, 3, 0, -3, -6, -3, -6]) x_vals = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8]) # 计算相邻差的符号 diff_sign = np.sign(np.diff(db)) # 检测符号变化位置,即反转点 turn_points = diff_sign[1:] != diff_sign[:-1] # 初始化计数标记数组 counter_marker = np.zeros_like(db, dtype=int) # 给反转点位置打标记 counter_marker[1:-1][turn_points] = 1 # 累计求和得到最终计数序列 counter_vals = np.cumsum(counter_marker) print(counter_vals) # 输出:[0 1 2 2 2 2 3 4 4],和期望结果完全一致 # 原有绘图逻辑 plt.scatter(x_vals, db) plt.plot(x_vals, db) plt.show()
注意事项
- 该实现时间复杂度为O(n),和序列长度线性相关,处理长序列运行效率很高
- 如果数据存在连续持平(差值为0)的段,可以先对
diff_sign做前向填充非零值处理,再检测符号变化,避免持平段干扰反转点判断
内容的提问来源于stack exchange,提问作者brezelbayer
相关产品推荐
相关产品推荐

