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 32-й массив: 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по мере необходимости для любого приложения, для которого вы используете тензоры. К работе с многомерными тензорами нужно привыкнуть. Но как только вы освоитесь, это будет очень просто, и я считаю, что это круто.

Другие вопросы по тегам