如何识别曲线中的特征拐点(橙色标记点)?代码优化求助
优化曲线特征拐点提取的Python代码建议
问题背景
需要提取曲线中橙色标记的特征拐点,但当前代码因插值后y值在断点区间内并非始终相等,导致返回大量冗余点,需优化代码精准定位目标拐点。
现有代码:
result = [] for i in range(len(df)): if i == 0 or df['y'].iloc[i] != df['y'].iloc[i - 1]: result.append(df.iloc[i]) continue if i < len(df) - 1 and df['y'].iloc[i] != df['y'].iloc[i + 1]: result.append(df.iloc[i])
测试数据(插值后生成高密度时间序列):
import numpy as np time = np.arange(0, 2200, 100) values = np.array([-0.1, 0, 0.13, 0.27, 0.27, 0.4, 0.27, 0.27, 0.13, 0.13, 0.01, 0.01, -0.13, -0.13, -0.27, -0.4, -0.4, -0.27, -0.13, -0.13, 0, 0]) full_time = np.arange(0, 2200, 1) full_values = np.interp(full_time, time, values)
优化思路与代码
插值后的曲线属于分段线性曲线,特征拐点本质是斜率发生突变的位置(即原始数据的关键点),以下两种方案可精准提取:
方案1:基于斜率变化检测
通过计算相邻点的斜率,定位斜率突变的位置,这些位置就是目标拐点:
import pandas as pd import numpy as np # 将测试数据转为DataFrame df = pd.DataFrame({'time': full_time, 'y': full_values}) # 计算相邻点的斜率(一阶差分) df['slope'] = df['y'].diff() / df['time'].diff() # 填充第一个点的斜率(用第二个点的斜率替代) df['slope'].iloc[0] = df['slope'].iloc[1] # 筛选斜率与前一个点不同的行(斜率突变点) mask = df['slope'] != df['slope'].shift(1) result = df[mask] print(result)
方案2:直接匹配原始关键点
若确定特征拐点就是原始采样数据中的点,可直接通过时间匹配提取,效率更高:
import pandas as pd df = pd.DataFrame({'time': full_time, 'y': full_values}) # 筛选原始time对应的行 result = df[df['time'].isin(time)] print(result)
方案说明
- 方案1适用于所有分段线性曲线,能自动检测所有斜率变化的拐点,不受原始数据平台段影响;
- 方案2更高效,若明确目标拐点为原始采样点,直接匹配时间即可避免冗余计算。
内容的提问来源于stack exchange,提问作者Magnetinis
相关产品推荐
相关产品推荐

