2016-03-15 2 views
0

Для начала я делаю Runge-Kutta в массиве с тремя DOF NumPy. Мой массив выглядит следующим образом:Добавление в NumPy (Python) Array

состояния = [[X], [Vx], [Y], [Vy], [Z], [Vz]]

Я бегу мой Рунге-Кутта, и получить мои четыре значения K, которые я переношу с помощью [newaxis]. Поэтому, когда я пытаюсь добавить новые состояния в мой массив состояний следующим образом:

states = append(states, states[:,i] + (K1.T + 2 * K2.T + 2 * K3.T + K4.T)/6, 1)

, где «я» счетчик, который начинается с 0 и подсчитывает для каждой итерации.

Однако, когда я запускаю свой код, мой массив результирующих состояний не является двумя столбцами из шести элементов. Похоже, что я добавляю вектор-строку вместо вектора столбца в мой массив состояний. Я запустил код с двумя элементами (X, Vx) в столбце, и все было добавлено просто отлично (или, по крайней мере, мой результат имел смысл).

Я попытался заставить результат моего Рунге-Кутты быть вектором столбца, но это испортило мой расчет значений K. Я пробовал варианты моего кода добавления и все еще имею тот же результат.

Это клон кода Matlab, и я не смог найти что-либо на массивах NumPy и индексировании, которые мне помогают.

Любая помощь приветствуется.

Спасибо.

UPDATE: states[:,0] = [[0], [2300], [0], [0], [-1600], [500]] - оригинальный states[:,1] = [[2300], [2100], [0], [0], [-2100], [450]] - добавить states = [[0, 2300], [2300, 2100], [0, 0], [0, 0], [-1600, -2100], [500, 450]] - конечный Эти векторы-столбцы.

+1

@JoranBeasley - вы [не можете] http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.append.html)? – MSeifert

+1

lol ну теперь я чувствую себя немой ... Я никогда не понимал ... настолько глупо: P –

+0

Лучше думать о 'государствах 'как о списке Python, а не о массиве. Вы можете легко собирать массивы в списке. Создание массива путем многократной конкатенации - это плохая практика «numpy». – hpaulj

ответ

1

Вы должны складывать их вместо appending.

Взятые из numpy documentation следует один из методов стека, например: np.vstack:

a = np.array([1, 2, 3]) 
b = np.array([2, 3, 4]) 
c = np.vstack((a,b)) 
print(c) 
# array([[1, 2, 3], 
#  [2, 3, 4]]) 

или в зависимости от ваших полученных данных есть также np.hstack (стек вдоль первой оси) и np.dstack (складывают вдоль трети ось).

+0

Я хочу перейти от одной колонки до 1000 столбцов за 1000 секунд. Кажется, что стекирование строк. Могу ли я делать столбцы? – user1187621

+0

'np.hstack' по столбцам. Но это также может быть «dstack». Если вы покажете, как выглядит вход и выход (примерный), легче определить, какой из них вам нужен. – MSeifert

+0

'states = array ([[X], [Vx], [Y], [Vy], [Z], [Vz]]): : [[X] [Vx] [Y] [ Vy] [Z] [Vz]] Я получаю ошибку EOF как с «hstack», так и «dstack» – user1187621

0

Вы не должны добавлять массивы, если можете избежать, из-за проблем с эффективностью. Добавление означает изменение выделенного объема памяти, который может работать в несмежном пространстве памяти, поэтому потребуется неэффективное распределение или перераспределение. Это может значительно замедлить вашу программу, особенно для больших массивов.

Если вы используете фиксированный временной шаг Runge-Kutta, вы заранее знаете, сколько точек ваше решение будет иметь в момент времени T. Это N = (T-t0)/h + 1, где T - окончательный время, t0 - начальное время, h - временной интервал. Вы можете инициализировать свой массив нулями (используя states = np.zeros((N,3))) и заполнить значения, как вы идете, связав индекс i со временем t[i] = t0 +i*h. Это будет внутри цикла: states[:,i+1] = states[:,i] + RK4_step(states[:,i]), где RK4_step(states[:,i]) - это функция, возвращающая массив (столбец) с вашим изменением значений состояния за один шаг метода Рунге-Кутта.

Даже если ваш временной шаг является переменным, вы все равно должны это сделать, но с неравномерным временем t[i] = t0 +i*h.

Или вы можете использовать numpy.integrate.ode_int(), который возвращает решение ODE в требуемое время.