使用 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 中使用 tensordot 或 einsum 来实现此目的?我浏览了各种帖子,也做了一些试验和错误,但没有运气。如果有人能提供解决方案甚至一些有用的指示,将不胜感激!
向 A
添加一个维度,因此它是 (2,5,1,3):
A[:,:,None,:]*B
对于 einsum,这应该可行,但我认为它有点矫枉过正(没有乘积之和):
np.einsum('ijl,ijkl->ijkl',A,B)
(我无法用您的数组证明这一点,因为 B
太大而无法使用复制粘贴进行复制。)
我有一个 (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 来实现此目的?我浏览了各种帖子,也做了一些试验和错误,但没有运气。如果有人能提供解决方案甚至一些有用的指示,将不胜感激!
向 A
添加一个维度,因此它是 (2,5,1,3):
A[:,:,None,:]*B
对于 einsum,这应该可行,但我认为它有点矫枉过正(没有乘积之和):
np.einsum('ijl,ijkl->ijkl',A,B)
(我无法用您的数组证明这一点,因为 B
太大而无法使用复制粘贴进行复制。)