【问题标题】:Edge of a curve based out of numpy array基于 numpy 数组的曲线边缘
【发布时间】:2021-09-17 01:25:38
【问题描述】:

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

CSV file

【问题讨论】:

  • 能否再添加几个 CSV?
  • 我的方法是:1)过滤数据以平滑曲线 2)找到通过点 (x-y)、x、(x+y) 的圆具有最小半径的索引 x(对于ex y=400) - 中心位于 x 点上方,前半部分和后半部分分别

标签: python numpy filtering smoothing derivative


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2021-01-21
    相关资源
    最近更新 更多