онемел.точка-обеспечение совместимости матриц?


У меня есть двумерный массив 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 2

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, либо суммировать элементы вместе, чтобы получить один скаляр.