假设我们有:
- 形状为
(F,1)
的行向量V
,以及 - 形状为
(N, F, X, Y)
的 4-D 张量T
。
作为一个具体示例,令 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()
,但我无法弄清楚每个函数实际上在做什么更基本的水平,所以我想请求更详细的解释如何完成这个计算。
谢谢
最佳答案
乘法:您只需将文本转换为 eisnum
的索引名称,它将负责广播:
TV = np.einsum('ijkl,j->ijkl',T,V)
添加:只需使用 None
将尺寸添加到 V
中即可匹配 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]
电视:
[[[[ 7 4]
[ 5 9]]
[[ 1 4]
[ 3 7]]
[[ 9 8]
[ 3 3]]]
[[[ 8 0]
[ 8 7]]
[[ 3 7]
[10 3]]
[[10 8]
[ 6 11]]]]
关于python - 如何广播向量和张量之和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63222872/