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

如何识别曲线中的特征拐点(橙色标记点)?代码优化求助

优化曲线特征拐点提取的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:57:13