如何广播求和向量和张量?
How to Broadcast Sum Vector and Tensor?
假设我们有:
- 行向量
V
,形状 (F,1)
,
- 形状为
(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]
示例 input/output 显示了添加所需的输出行为:
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]]]]
假设我们有:
- 行向量
V
,形状(F,1)
, - 形状为
(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]
示例 input/output 显示了添加所需的输出行为:
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]]]]