首页 > 解决方案 > 基于 numpy 数组的曲线边缘

问题描述

我正在寻找一些数学指导,以帮助我找到曲线的索引位置(红色圆圈),如下图所示。曲线只是一维 numpy 数组。我试过 scipy - gaussianfilter1d。我也尝试过np.gradient,但我离我想做的事情还很远。渐变是突然变化的,所以一阶渐变应该给我正在寻找的东西。然后我意识到数据不平滑,我尝试通过'gaussianfilter1d'进行平滑。即使那样,我也无法确定它在哪里发生了变化。我有各种类型的这些 numpy 数组(大小相同,值范围为 0 - 1),因此解决方案必须适用,并且不依赖于给定的数据集。所以我不能硬编码。任何想法将不胜感激。

CSV 文件

在此处输入图像描述

标签: pythonnumpyfilteringsmoothingderivative

解决方案


首先,您使用 . 从数据中获得平滑函数scipy's UnivariateSpline。然后绘制绝对斜率至少为最大值 1/4 的区域。

from scipy.interpolate import UnivariateSpline

f= UnivariateSpline(np.arange(5500), y, k=3, s=0.3)
df = f.derivative()
plt.plot(x,f(x))
cond = np.abs(df(x)) > 0.25*np.max(np.abs(df(x)))
plt.scatter(x[cond],f(x[cond]), c='r')

带有高斜率标记的功能 看起来你正在寻找的是标记的第一个和最后一个点。所以你也是

(x[cond].min(),f(x[cond].min()).item()), (x[cond].max(), f(x[cond].max()).item())

你的观点是:

((1455, 0.20595740349084446), (4230, 0.1722999962943679))

推荐阅读