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

时间:2016-02-02 19:28:10

标签: python numpy matrix-multiplication

我有两个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)

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

1 个答案:

答案 0 :(得分:3)

您可以将AB的扩展维度与np.newaxis/None一起使用,为broadcasting引入类似的矢量化解决方案 -

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

说明: np.outer(np.transpose(A[i]), B[i])基本上在柱状A[i]B[i]之间进行元素乘法运算。您正在A中针对B中的相关行重复此行。请注意,np.transpose()似乎没有产生任何影响,因为np.outer会处理预期的元素乘法。

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

  1. 扩展AB的维度以形成3D形状,以便我们保持axis=0对齐并保持为axis=0那些扩展版本。因此,我们决定最后两个轴。
  2. 要引入元素乘法,将原始2D版本中的A axis=1推送到其axis=1版本中的3D,从而创建单个维度在axis=2处获取A的扩展版本。
  3. 3D A版本axis=1的最后一个单独维度必须与原始2D BbroadcastingB的元素对齐,才能axis=1 1}}发生。因此,axis=2的扩展版本会将其2D版本中3D的元素推送到其axis=1版本中的A[...,None],从而为{{1}创建单个维度}}。
  4. 最后,扩展版本将是:B[:,None,:]& @Page({ templateUrl: 'build/pages/tabs/tabs.html' }) export class TabsPage { constructor(params: NavParams) { this.params = params; console.log(this.params); // returns NavParams {data: Object} // this tells the tabs component which Pages should be each tab's root Page this.tab1Root = Tab1; this.tab2Root = Tab2; this.tab3Root = Tab3; } } ,乘以谁会给我们所需的输出。