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

如何简便计算数据集反转点对应的从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:21:33