2D 矩阵相乘得到 3D 矩阵

问题描述 投票:0回答:1

我有两个维度为 (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.
python numpy multidimensional-array numpy-ndarray array-broadcasting
1个回答
1
投票
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]]])
© www.soinside.com 2019 - 2024. All rights reserved.