def get_paraboloids(x, y, c=0.2):
"""Return list of points (x,y) that are part of paraboloids in given set.
x: np.ndarray of floats
y: np.ndarray of floats
c: slopyness coefficient
"""
slopes = convolute_slopes(y)
mean = np.mean(np.abs(slopes))
w = np.where(np.diff(slopes > 0) > 0)[0] + 1
w = np.insert(w, [0, len(w)], [0, len(x)])
return [(x[lower:upper], y[lower:upper])
for lower, upper in zip(w[:-1], w[1:])
if np.mean(slopes[lower:upper]) > mean * c]
from matplotlib import pyplot as plt
plt.figure(figsize=(10 * len(datasets), 10))
for i, points in enumerate(datasets):
x, y = points
plt.subplot(1, len(datasets), i + 1)
plt.plot(x, y, linewidth=1)
for gx, gy in get_paraboloids(x, y):
plt.plot(gx, gy, linewidth=3)
plt.show()
据我所知,曲线是平滑的,无噪声的,因此抛物线顶点只对应于局部极小值。你知道吗
您没有指定如何定义开始和结束,因此我将假设“直到拐点”。要定位这些,可以计算一阶差来估计坡度,并检测两侧绝对坡度的第一个最大值。你知道吗
不要期望在这些极限上有很好的精度,这是一个不适定的问题。你知道吗
使用
numpy
的解决方案对于这个解决方案,我将使用
numpy
:数据集
创建数据集
OPPhteven很好地提供了要处理的数据集,但是由于到数据集的链接趋于消失,我还创建了一个函数来生成类似的曲线。你知道吗
加载数据集
阐述要点
斜率卷积
因为这些点是离散的,所以我们必须平均斜率。其中一种方法是通过统一内核。你知道吗
获得抛物面
现在,我们可以计算卷积斜率,确定它在何处切换方向,并选择那些平均斜率大于绝对平均值乘以一个描述抛物面“斜率”的系数的间隔。你知道吗
如何使用这个和可视化
首先,我们加载数据集并生成更多数据:
然后,迭代每个数据集:
结果
相关问题 更多 >
编程相关推荐