python - 基于 numpy 数组的曲线边缘
问题描述
我正在寻找一些数学指导,以帮助我找到曲线的索引位置(红色圆圈),如下图所示。曲线只是一维 numpy 数组。我试过 scipy - gaussianfilter1d
。我也尝试过np.gradient
,但我离我想做的事情还很远。渐变是突然变化的,所以一阶渐变应该给我正在寻找的东西。然后我意识到数据不平滑,我尝试通过'gaussianfilter1d'进行平滑。即使那样,我也无法确定它在哪里发生了变化。我有各种类型的这些 numpy 数组(大小相同,值范围为 0 - 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))
推荐阅读
- c++ - 可以在 CUDA 速度计算中实现 Tensorflow 自定义操作梯度吗?
- java - 不在 java.net.URL 中使用 ">="
- angular - 在输入点击时为日期选择器创建指令
- python - Pil/Pillow 不支持 PNG 文件 - Kivy Buildozer
- c# - 实体框架核心——“如果不存在则插入”可能吗?
- android - Android:如何使用 NotificationChannel 创建永久通知
- azure - 如何在 C# 代码中从 am gremlinquery 获取单个值
- html - 如何调整复选框周围的点击区域?
- json - POST json 到 WCF 服务返回(400 BAD 请求)
- reactjs - 是否有可能在不更改道具和状态的情况下重新渲染组件