Как транслировать вектор суммы и тензор? - PullRequest
2 голосов
/ 03 августа 2020

Предположим, у нас есть:

  • вектор-строка V формы (F,1) и
  • 4-мерный тензор T формы (N, F, X, Y).

В качестве конкретного примера пусть N, F, X, Y = 2, 3, 2, 2. Пусть V = [v0, v1,v2].

Затем я хочу поэлементно добавить v0 к внутренней матрице 2x2 T[0,0], v1 к T[0,1] и v2 к T[0,2]. Точно так же я хочу добавить v0 к T[1,0], v1 к T[1,1] и v2 к T[1,2].

Итак, на «самом внутреннем» уровне сложение между 2x2 матрица и скаляр, например T[0,0] + v0, используют широковещательную рассылку для поэлементного добавления v0. Тогда я пытаюсь применить это в более общем плане к каждому внутреннему 2x2.

Я пробовал использовать np.einsum() и np.tensordot(), но не мог понять, что это за каждая из этих функций. на самом деле происходит на более фундаментальном уровне, поэтому я хотел попросить более пошаговое объяснение того, как это вычисление может быть выполнено.

Спасибо

1 Ответ

2 голосов
/ 03 августа 2020

Для умножения : вы можете просто перевести свой текст в индексы с именами eisnum, и он позаботится о трансляции:

TV = np.einsum('ijkl,j->ijkl',T,V)

Чтобы добавить : Просто добавьте размеры к вашему V, используя None, чтобы сопоставить последние два измерения T, и вещание позаботится обо всем остальном:

TV = T + V[:,None,None]

Пример ввода / вывода, который показывает желаемое поведение вашего вывода для добавления:

T:

[[[[7 4]
   [5 9]]

  [[0 3]
   [2 6]]

  [[7 6]
   [1 1]]]


 [[[8 0]
   [8 7]]

  [[2 6]
   [9 2]]

  [[8 6]
   [4 9]]]]

V:

[0 1 2]

TV:

[[[[ 7  4]
   [ 5  9]]

  [[ 1  4]
   [ 3  7]]

  [[ 9  8]
   [ 3  3]]]


 [[[ 8  0]
   [ 8  7]]

  [[ 3  7]
   [10  3]]

  [[10  8]
   [ 6 11]]]]
...