онемел.точка-обеспечение совместимости матриц?
У меня есть двумерный массив X
.
X[i]
представляет собой массив 1D с 3 значениями.
Его форма: (3L,)
Тогда у меня есть трехмерный массив, g
, который равен 2x3x2.
Если я выведу форму g[j]
, то она будет: (3L,2L)
, а форма g[j][i]
будет (2L,)
Теперь я выполняю такой цикл:
for j in range(len(g)):
for i in range(no_samples):
e = math.exp(1. + np.dot(X[i], g[j][i]) - np.dot(X[i],g[i_class][i]))
Но я получаю следующую ошибку:
e = math.exp(1. + np.dot(X[i], g[j][i]) - np.dot(X[i],g[i_class][i]))
ValueError: matrices are not aligned
Я думаю, что понимаю проблему, но не знаю, как ее решить. Я попробовал транспонировать g[j][i]
, но это ничего не изменило. Я пытался изменение формы X[i]
, чтобы заставить его быть (3L,1L)
. Я подумал, что если X[i]
равно 3x1, а g[j][i]
равно 1x2, то матрицы совместимы, и я смогу использовать np.dot
. Но мне кажется, я что-то упускаю.
Как правильно это сделать?
1 ответ:
Проблема заключается в том, что оба массива имеют только 1D и неодинаковый размер. Существует два решения этой проблемы:
Начнем с этого:
>>> x array([3, 4, 5]) >>> x.shape (3,) #Same shape as your array, but note that it is only 1D >>> g array([2, 3])
Способ 1-Изменить Форму:
>>> np.dot(x.reshape(3,1), g.reshape(1,2)) array([[ 6, 9], [ 8, 12], [10, 15]])
Путь 2-
np.outer
:>>> np.outer(x,g) array([[ 6, 9], [ 8, 12], [10, 15]])
При обращении к массивам numpy вместо
g[i_class][i]
Используйтеg[i_class,i]
. Кроме того, транспонирование массива 1D не изменяет массив.Наконец, если вы запустите сценарий, как показано на рисунке, вы получите дополнительную ошибку.
math.exp
не принимает массивы numpy в качестве входных данных. К чтобы обойти это, вам нужно либо использоватьnp.exp
, либо суммировать элементы вместе, чтобы получить один скаляр.