Numpy Piecewise с N сегментами

Следуя этому очень иллюстративному решению ( Невозможно сделать кусочно-кусочно с 3 сегментами), я просто хотел бы расширить такой алгоритм до N частей без необходимости кодировать непосредственно каждый отдельный фрагмент. То есть я бы хотел расширить случай из 3 частей, представленных в ответе @BM, до N случаев.

def f(x,x0,y0,x1,k1,k2,k3):
    # x0,y0 : first breakpoint
    # x1 : second breakpoint
    # k1,k2,k3 : 3 slopes.

    y1=y0+ k2*(x1-x0) # for continuity
    return (
    (x<x0)              *   (y0 + k1*(x-x0))      +
    ((x>=x0) & (x<x1))  *   (y0 + k2*(x-x0))      +
    (x>=x1)             *   (y1 + k3*(x-x1)))

в моем нынешнем виде я кодировал что-то столь же ужасное, как это:

from scipy.optimize import curve_fit
for piece_number in nmb_pieces:
    if piece_number == 1:
        p, e = curve_fit(linear_fit, original_x, series_to_fit)
        fit_curve = linear_fit(original_x, *p)
    elif piece_number == 2:
        p, e = curve_fit(piecewise_double, original_x, series_to_fit)
        fit_curve = piecewise_double(original_x, *p)
    elif piece_number == 3:
        p, e = curve_fit(piecewise_triple, original_x, series_to_fit)
        fit_curve = piecewise_triple(original_x, *p)
    else:
        p, e = curve_fit(piecewise_fourth, original_x, series_to_fit)
        fit_curve = piecewise_fourth(original_x, *p)

где piecewise_triple а также piecewise_fourth соответственно функция, представленная ранее, и расширение в 4th степень. ясно, что я хотел бы расширить что-то вроде:

from scipy.optimize import curve_fit
from functools import partial
def piecewise_nth(piece_number, args)
    return ...

for piece_number in nmb_pieces:
    if piece_number == 1:
        p, e = curve_fit(linear_fit, original_x, series_to_fit)
        fit_curve = linear_fit(original_x, *p)
    else:
        p, e = curve_fit(partial(piecewise_nth, piece_number=piece_number), original_x, series_to_fit)
        fit_curve = partial(piecewise_nth, piece_number=piece_number)(original_x, *p)

но я должен понять, чтобы динамически строить

y1=y0+ k2*(x1-x0)

а также

return (
(x<x0)              *   (y0 + k1*(x-x0))      +
((x>=x0) & (x<x1))  *   (y0 + k2*(x-x0))      +
(x>=x1)    

есть идеи?

0 ответов

Другие вопросы по тегам