我有两个维度为 (n_m, n_u) 和 (n_m, n) 的矩阵 A 和 B。我想要一个维度为 (n, n_m, n_u) 的 3D 矩阵,这样 B 的第一列与 A 的每一列相乘(按元素),B 的第二列通过执行以下操作形成 3D 轴中的下一个元素同样,等等。
假设我有-
A = |1 2 3|
|4 5 6|
B = |1 2|
|3 4|
The new matrix should be -
C = |1 2 3| |2 4 6|
|12 15 18| |16 20 24|
C is 3D.
In [42]: a=np.arange(1,7).reshape(2,3); b=np.arange(1,5).reshape(2,2)
制作
a
(2,1,3) 和 b
(2,2,1),将其产品广播到 (2,2,3):
In [44]: a[:,None,:] * b[:,:,None]
Out[44]:
array([[[ 1, 2, 3],
[ 2, 4, 6]],
[[12, 15, 18],
[16, 20, 24]]])
将
b
更改为 (2,4) 形状
In [45]: a=np.arange(1,7).reshape(2,3); b=np.arange(1,9).reshape(2,4)
In [46]: a,b
Out[46]:
(array([[1, 2, 3],
[4, 5, 6]]),
array([[1, 2, 3, 4],
[5, 6, 7, 8]]))
In [47]: a[:,None,:] * b[:,:,None]
Out[47]:
array([[[ 1, 2, 3],
[ 2, 4, 6],
[ 3, 6, 9],
[ 4, 8, 12]],
[[20, 25, 30],
[24, 30, 36],
[28, 35, 42],
[32, 40, 48]]])
产生 (2,4,3) 3d 数组。
这可以转换为 (4,2,3),但我不认为这就是你的
C
所暗示的。
In [48]: (a[:,None,:] * b[:,:,None]).transpose(1,0,2)
Out[48]:
array([[[ 1, 2, 3],
[20, 25, 30]],
[[ 2, 4, 6],
[24, 30, 36]],
[[ 3, 6, 9],
[28, 35, 42]],
[[ 4, 8, 12],
[32, 40, 48]]])
尝试对 (2,2) 进行转置:
In [49]: a=np.arange(1,7).reshape(2,3); b=np.arange(1,5).reshape(2,2)
In [50]: (a[:,None,:] * b[:,:,None]).transpose(1,0,2)
Out[50]:
array([[[ 1, 2, 3],
[12, 15, 18]],
[[ 2, 4, 6],
[16, 20, 24]]])