0

请找到所附的图表。我需要找到点“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()

图形

4

1 回答 1

1

我不太明白你的问题。您是否希望代码使用某些计算机视觉从该图形图像中提取相关数据点,或者您只想要使用定义xy列表的数据点坐标?如果是后者,您可以执行以下操作:

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是多余的。只需使用方括号。

于 2017-07-15T08:10:15.330 回答