Разделить массив 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]