2016-02-02 45 views
2

我有两个numpy的阵列,像2D矩阵的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) 

有没有什么更好的办法做这个任务。

回答

2

您可以使用扩展的ABnp.newaxis/None尺寸broadcasting带来了像这样一个量化的解决方案 -

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

说明:一个柱状版本的A[i]之间np.outer(np.transpose(A[i]), B[i])基本不按元素乘法和B[i]。您正在针对A中的所有行对B中的相应行重复此操作。请注意,np.transpose()似乎没有产生任何影响,因为np.outer负责预期的元素乘法。

我会介绍这些步骤在矢量语言从而实现,像这样 -

  1. 延长AB尺寸形成3D形状对他们俩的,使得我们保持axis=0对齐,并保持在这两个扩展版本中也都是axis=0。因此,我们留下来决定最后两个轴。
  2. 为了使在的elementwise乘法,推A的axis=1在其原始的2D版本axis=1在其3D版本,从而在axis=2A扩展版本创建一个单维。
  3. 3D版本的A这最后一个单维度具有与从axis=12D版本的B元素对齐让broadcasting发生。因此,B的扩展版本将其2D版本中的axis=1的元素推送到axis=23D版本,从而为axis=1创建单身维度。

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

+0

哇!一个班轮......你能解释一下这个答案吗? – Shweta

+0

如何为2 theano矩阵做类似的事情? – Shweta

+0

@Shweta AFAIK'theano'也支持'broadcast',所以我认为这应该可以像forano数组/矩阵一样工作,对吗? – Divakar