python – 2d矩阵的Numpy矩阵乘法给出3d矩阵

我有两个numpy数组,比如

A: = array([[0, 1],  
            [2, 3],  
            [4, 5]])   

B = array([[ 6,  7],  
           [ 8,  9],  
           [10, 11]])

对于A和B的每一行,分别说Ra和Rb,我想计算转置(Ra)* Rb.所以对于A和B的给定值,我想要以下答案:

array([[[ 0,  0],  
        [ 6,  7]],  

       [[ 16,  18],  
        [ 24,  27]],  

       [[ 40,  44],  
        [ 50,  55]]])

我写了以下代码来做到这一点:

x = np.outer(np.transpose(A[0]), B[0])
for i in range(1,len(A)):
    x = np.append(x,np.outer(np.transpose(A[i]), B[i]),axis=0)

有没有更好的方法来完成这项任务.

最佳答案
你可以使用np.newaxis/None的A和B的扩展尺寸来引入broadcasting这样的矢量化解决方案 –

A[...,None]*B[:,None,:]

说明:np.outer(np.transpose(A [i]),B [i])基本上在A [i]和B [i]的柱状版本之间进行元素乘法.你正在为A中的所有行重复这个对B中的纠正行.请注意,np.transpose()似乎没有任何影响,因为np.outer负责预期的元素乘法.

我会用矢量化的语言描述这些步骤,然后像这样实现 –

>扩展A和B的尺寸以形成两者的3D形状,使得我们保持轴= 0对齐并在这两个扩展版本中保持轴= 0.因此,我们决定最后两个轴.
>为了引入元素乘法,将其原始2D版本中A的轴= 1推入其3D版本中的轴= 1,从而在轴= 2处为A的扩展版本创建单个维度.
> 3D版本A的最后一个单独维度必须与原始2D版本B中的轴= 1的元素对齐才能进行广播.因此,B的扩展版本将其2D版本中的轴= 1的元素在其3D版本中被推送到轴= 2,从而为轴= 1创建单个维度.

最后,扩展版本将是:A […,None]& B [:,None,:],乘以谁会给我们所需的输出.

转载注明原文:python – 2d矩阵的Numpy矩阵乘法给出3d矩阵 - 代码日志