使用 numpy einsum 或 tensordot 将 4D 张量与 3D 张量相乘

Multiplying a 4D tensor with a 3D tensor using numpy einsum or tensordot

我有一个 (2, 5, 3) 3D 张量和一个 (2, 5, 4, 3) 4D 张量我正在尝试通过以下方式计算它们之间的逐行乘积:

例如,考虑以下 3D 和 4D 张量:

A = [[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]
  [ 9 10 11]
  [12 13 14]]

 [[15 16 17]
  [18 19 20]
  [21 22 23]
  [24 25 26]
  [27 28 29]]] 

B = [[[[77 11 61]
   [55 98 50]
   [58 29 13]
   [56 48 52]]

  [[57  1 18]
   [ 7 52  3]
   [40 95 85]
   [18 13 27]]

  [[17 28 49]
   [48  2 62]
   [57  4  7]
   [86 62 98]]

  [[61 72 99]
   [36 49 71]
   [58 82 80]
   [54 45 90]]

  [[87 53 27]
   [43 90 25]
   [21 80 66]
   [ 2 52 98]]]


 [[[75 24 33]
   [87 14 82]
   [91 46 90]
   [79  6 13]]

  [[86 83 75]
   [93 33 36]
   [62  2 92]
   [91 45 12]]

  [[ 1  9 32]
   [41 77 76]
   [21 60 22]
   [44 59 79]]

  [[ 5 90 88]
   [31 54 93]
   [66 20 43]
   [69 15 79]]

  [[50 58 84]
   [78 35 92]
   [60 83 93]
   [44 31 46]]]]

乘积张量C与4D张量具有相同的维度,是通过将3D张量(A)的每一行与4D张量B中的每个3 x 4子矩阵中的所有行相乘得到的.所以C中的第一个3 x 4子矩阵是:

[0 1 2] * [[77 11 61]
           [55 98 50]
           [58 29 13]
           [56 48 52]]

= [[0 11 122]
   [0 98 100]
   [0 29 26 ]
   [0 48 104]]

其他 9 行相同以产生 (2 5 4 3) 张量。

我想知道是否有办法在 numpy 中使用 tensordoteinsum 来实现此目的?我浏览了各种帖子,也做了一些试验和错误,但没有运气。如果有人能提供解决方案甚至一些有用的指示,将不胜感激!

A 添加一个维度,因此它是 (2,5,1,3):

A[:,:,None,:]*B 

对于 einsum,这应该可行,但我认为它有点矫枉过正(没有乘积之和):

np.einsum('ijl,ijkl->ijkl',A,B)  

(我无法用您的数组证明这一点,因为 B 太大而无法使用复制粘贴进行复制。)