请查看附图。 我需要找到点“a”和“b”。 请在python中建议任何方法。
通过获取运行时间绘制图表,如下所示:
x = ([1000, 2000, 3000, 4000, 5000, 6000,7000, 8000, 9000])
和
y = ([2314,802,519,417,358,318,302,284,280])
需要找出“a”和“b”点,以便我可以将它们单独用于其他任务
完整代码:
def piecewise_linear(x, x0, y0, k1, k2):
return np.piecewise(x, [x < x0], [lambda x:k1*x + y0-k1*x0, lambda x:k2*x + y0-k2*x0])
perr_min = np.inf
p_best = None
for n in range(100):
k = np.random.rand(10)*20
p , e = optimize.curve_fit(piecewise_linear, x, y)
perr = np.sum(np.abs(y-piecewise_linear(x, *p)))
if(perr < perr_min):
print "success"
perr_min = perr
p_best = p
xd = np.linspace(min(x), max(x), 100)
plt.figure()
plt.plot(x, y, "bo")
y_out = piecewise_linear(xd, *p_best)
plt.plot(xd, y_out)
plt.ylabel('Number of KeyFrames')
plt.xlabel('Threshold Values')
plt.show()
答案 0 :(得分:1)
我不完全理解你的问题。您是否希望代码使用某些计算机视觉从该图形图像中提取相关数据点,或者您只是想使用定义的x
和y
列表来获取数据点的坐标?如果是后者,您可以执行以下操作:
change_points = [] # to store the points you want
curr_slope = (y[1] - y[0]) / (x[1]-x[0]) # to be used for comparision
for i in range(2, len(y)):
prev_slope = curr_slope
curr_slope = (y[i]-y[i-1]) / (x[i]-x[i-1])
if not (0.2 <= (curr_slope / prev_slope) <= 5):
change_points.append((x[i-1], y[i-1]))
for point in change_points:
print(point)
这会打印(2000, 802)
。有没有什么定义绿线?否则,在这里我设置了一个比率阈值,仅添加将斜率改变为“足够大”(在这种情况下,系数为5)量的点。
此外,x
和y
初始化中的括号是多余的。只需使用方括号。