Numpy矩阵乘法:将二维矩阵相乘得到三维矩阵

3

I have two numpy arrays, like

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

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

对于A和B的每一行,分别称为Ra和Rb,我想要计算transpose(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个回答

5
你可以使用 np.newaxis/None 扩展AB的维度,并带入broadcasting,以实现向量化的解决方案,代码如下 -
A[...,None]*B[:,None,:]
Explanation : 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. 为了引入元素级别的乘法,在A的原始2D版本中将axis=1推到其3D版本中的axis=1,从而在扩展的A版本中创建一个单例维度。
  3. 这个3D版本的A的最后一个单例维度必须与B的原始2D版本中的axis=1元素对齐,以便进行broadcasting。因此,扩展版本的B将具有其2D版本中axis=1的元素被推到其3D版本中的axis=2,从而为axis=1创建一个单例维度。

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


我如何为两个Theano矩阵执行类似的操作? - Shweta
据我所知,theano 也支持 broadcasting,因此我认为这对于 theano 数组/矩阵也应该可以正常工作,不是吗? - Divakar
我也在考虑同样的问题,所以尝试了以下代码: y = T.dmatrix('y') x = T.dmatrix('x') z = x[...,None]*y[:,None,:] 但是这段代码报错了。我需要做些什么才能让它正常工作呢? - Shweta
AsTensorError: ('无法将省略号转换为TensorType', <type 'ellipsis'>) - Shweta
1
@Shweta 根据您的要求,我在这里添加了一些解释。花了我一段时间来整理所有思路并解决问题 :) - Divakar
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接