基于 numpy 数组的曲线边缘

Edge of a curve based out of numpy array

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

CSV file

首先,您使用 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))