Добавление двух одномерных массивов дает мне двухмерный массив (python) - PullRequest
1 голос
/ 29 мая 2020

У меня проблема, когда я добавляю два массива 4x1, и в результате получается массив 4x4, в котором первый столбец повторяется 4 раза. В результате мне нужен массив 4x1.

Я инициализировал массив как таковой (m = 4): z = np.zeros((m, len(t))

Позже в своем коде я передаю этот массив в функцию как z[:,k+1], поэтому размерность становится массивом 4x1. (Обратите внимание, что когда я печатаю этот массив на своем терминале, он отображается как вектор-строка, а не как вектор-столбец: [0. 0. 0. 0.], я тоже не уверен, почему это так). Массив, который я пытаюсь добавить в z, имеет следующую структуру при выводе на мой терминал:

[[#] [#] [#] [#]]

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

РЕДАКТИРОВАТЬ: У меня много кода, поэтому я включил сокращенную версию, которая, надеюсь, передаст идею.

n = 4   # Defines number of states
m = 4   # Defines number of measurements
x = np.zeros((n, len(t)), dtype=np.float64) # Initializes states
z = np.zeros((m, len(t)), dtype=np.float64) # Initializes measurements
u = np.zeros((1, len(t)), dtype=np.float64) # Initializes input
...
C = np.eye(m) # Defines measurement matrix
...
for k in range(len(t)-1):
  ...
  x_ukf[:,k+1], P_ukf[k+1,:,:] = function_call(x_ukf[:,k], z[:,k+1], u[:,k], P_ukf[k,:,:], C, Q, R, T) # Calls UKF function

Это приводит в функцию, в которой встречаются следующие значения (обратите внимание, что measurement_matrix = C (матрица 4x4), X - это матрица 4x9 и W вектор-строка 1x9):

Z = measurement_matrix @ X  # Calculates measurements based on sigma points
zhat = Z @ W.T
...
state_vec = state_vec + K @ (measurement_vec - zhat) # Updates state estimates

Проблема Я Имея это с выражением (measurement_vec - zhat). Вот где результат должен быть вектором 4x1, но я получаю матрицу 4x4 c.

1 Ответ

1 голос
/ 29 мая 2020

Иногда это называется broadcasting:

a, b = np.arange(4), np.arange(8,12)

c = a + b[:,None]

Вывод:

array([[ 8,  9, 10, 11],
       [ 9, 10, 11, 12],
       [10, 11, 12, 13],
       [11, 12, 13, 14]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...