Разделить массив NumPy на аналогичный массив на основе его содержимого

У меня есть двумерный массив, который представляет координаты (x, y) кривой, и я хочу разбить эту кривую на части одинаковой длины, получая координаты точек деления.

Наиболее простым примером является линия, определенная для двух точек, например [[0,0], [1,1]], и если я хочу разделить ее на две части, результат будет [0.5,0.5], а для три части [[0.33,0.33],[0.67,0.67]] и так далее.

Как я могу сделать это в большом массиве, где данные менее просты? Я пытаюсь разделить массив по длине, но результаты не очень хорошие.

2 ответа

Решение

Если я хорошо понимаю, что вы хотите, это простая интерполяция. Для этого вы можете использовать scipy.interpolate ( http://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html):

from scipy.interpolate import interp1d
f = interp1d(x, y) ## for linear interpolation
f2 = interp1d(x, y, kind='cubic') ## for cubic interpolation
xnew = np.linspace(x.min(), x.max(), num=41, endpoint=False)
ynew = f(xnew) ## or f2(xnew) for cubic interpolation

Вы можете создать функцию, которая возвращает координаты точек разделения, учитывая x, y и количество желаемых баллов:

def split_curve(x, y, npts):
    from scipy.interpolate import interp1d
    f = interp1d(x, y)
    xnew = np.linspace(x.min(), x.max(), num=npts, endpoint=False)
    ynew = f(xnew)
    return zip(xnew[1:], ynew[1:])

Например,

split_curve(np.array([0, 1]), np.array([0, 1]), 2) ## returns [(0.5, 0.5)]
split_curve(np.array([0, 1]), np.array([0, 1]), 3) ## [(0.33333333333333331, 0.33333333333333331), (0.66666666666666663, 0.66666666666666663)]

Обратите внимание, что x и y являются массивами, а не списками.

Возьмите длину линии на каждой оси, разделите, как вы хотите.

пример: точка 1: [0,0] точка 2: [1,1]

затем: длина линии по осям X: 1-0 = 1 также по осям Y.

Теперь, если вы хотите разделить его на две части, просто разделите эти длины и создайте новый массив.

[0,0], [. 5, 0,5],[1,1]

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