NumPy - Как транслировать массивы разных форм
У меня есть массив 200 х 200 векторов. Его форма (200, 200, 3)
,
У меня также есть массив из 22 векторов. Его форма (22,3)
,
Я хочу вычесть все 22 вектора во втором массиве из каждого вектора в первом массиве. Вывод должен иметь форму (200, 200, 22, 3)
,
Я хотел бы выполнить операцию, как
first - second
Но я получаю ошибку
*** ValueError: operands could not be broadcast together with shapes (200,200,3) (22,3)
Я думаю, что мне нужно как-то дополнить первый массив, чтобы NumPy мог транслировать массивы вместе. Как мне сообщить NumPy, как выполнять трансляцию?
2 ответа
1-й массив: 200 X 200 X 3
2-й массив: 22 X 3
В этом случае любая арифметическая операция, которую вы выполняете над этим, приведет к (200, 200, 3)
.
Вы могли получить ошибку, если попытались: 2nd Array - 1st Array
Вы можете проверить это: https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
Если вы хотите, чтобы конкретная ось транслировалась для какой-либо операции, она должна иметь размер
1
в этой оси. Так что если
a.shape
является
(200,200,3)
, а также
b.shape
является
(22,3)
, и желаемая форма вывода, то вам нужно будет немного изменить форму перед выполнением операции.
c = a.reshape(200,200,1,3) - b.reshape(1,1,22,3)
Сейчас же
c.shape
является
(200,200,22,3)
. Приведенный выше код выполнит желаемую задачу по вычитанию 22 трехмерных векторов из 40000 векторов.
Я лично считаю, что намного проще подумать о том, что каждая ось представляет для ваших тензоров, и просто настроить формы тензора или использовать
np.transpose
по мере необходимости для любого приложения, для которого вы используете тензоры. К работе с многомерными тензорами нужно привыкнуть. Но как только вы освоитесь, это будет очень просто, и я считаю, что это круто.