我有一个(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中使用 tensordot 或 einsum 来实现?我浏览了各种帖子,也做了一些试验和错误,但是没有运气。如果有人可以提供解决方案甚至一些有用的指针,将不胜感激!
答案 0 :(得分:1)
为A
添加一个尺寸,使其为(2,5,1,3):
A[:,:,None,:]*B
使用einsum可以正常工作,但我认为这太过分了(没有产品总和):
np.einsum('ijl,ijkl->ijkl',A,B)
(由于B
太大,无法使用n复制粘贴复制,因此无法用您的数组证明这一点。)