2d 矩阵的 Numpy 矩阵乘法得到 3d 矩阵

Numpy matrix multiplication of 2d matrix to give 3d matrix

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

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

您可以将 AB 的扩展维度与 np.newaxis/None to bring in broadcasting 一起用于像这样的矢量化解决方案 -

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

解释: np.outer(np.transpose(A[i]), B[i]) 基本上在 A[i] 和 [=17 的 columnar 版本之间进行元素乘法=].您正在针对 B 中的相应行对 A 中的所有行重复此操作。请注意 np.transpose() 似乎没有任何影响,因为 np.outer 负责预期的元素乘法。

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

  1. 扩展 AB 的尺寸,为它们形成 3D 形状,这样我们就可以保持 axis=0 对齐并保持 axis=0 在这两个扩展版本也是如此。因此,我们只剩下决定最后两个轴了。
  2. 为了引入元素乘法,将 A 的 axis=1 的原始二维版本推入其 3D 版本的 axis=1,因此在 axis=2 处为 A 的扩展版本创建了一个单例维度。
  3. 3D 版本 A 的最后一个单例维度必须与 B 原始 2D 版本中 axis=1 的元素对齐才能让broadcasting 发生了。因此,B 的扩展版本会将其 2D 版本中 axis=1 中的元素推送到其 3D 版本中的 axis=2,从而为 [=27 创建一个单例维度=].

最后,扩展版本将是:A[...,None] & B[:,None,:],将 whom 相乘会给我们想要的输出。