Python - Matrix外部产品

Lei*_* Yu 11 python numpy matrix

鉴于两个矩阵

A: m * r
B: n * r
Run Code Online (Sandbox Code Playgroud)

我想以产生另一矩阵C: m * n,每个条目C_ij是由外积计算的矩阵A_iB_j.

例如,

A: [[1, 2],
    [3, 4]]

B: [[3, 1],
    [1, 2]]
Run Code Online (Sandbox Code Playgroud)

C: [[[3, 1],  [[1 ,2],
     [6, 2]],  [2 ,4]],
     [9, 3],  [[3, 6],
     [12,4]],  [4, 8]]]
Run Code Online (Sandbox Code Playgroud)

我可以使用for循环来做,比如

    for i in range (A.shape(0)):
      for j in range (B.shape(0)):
         C_ij = np.outer(A_i, B_j)
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种矢量化的方法来进行此计算以加快速度?

hpa*_*ulj 14

爱因斯坦符号很好地表达了这个问题

In [85]: np.einsum('ac,bd->abcd',A,B)
Out[85]: 
array([[[[ 3,  1],
         [ 6,  2]],

        [[ 1,  2],
         [ 2,  4]]],


       [[[ 9,  3],
         [12,  4]],

        [[ 3,  6],
         [ 4,  8]]]])
Run Code Online (Sandbox Code Playgroud)


use*_*ica 6

temp = numpy.multiply.outer(A, B)
C = numpy.swapaxes(temp, 1, 2)
Run Code Online (Sandbox Code Playgroud)

NumPy ufuncs,例如multiply,有一种outer几乎可以做你想要的方法.下列:

temp = numpy.multiply.outer(A, B)
Run Code Online (Sandbox Code Playgroud)

产生这样的结果temp[a, b, c, d] == A[a, b] * B[c, d].你想要的C[a, b, c, d] == A[a, c] * B[b, d].该swapaxes呼叫重新排列temp,以把它放在你想要的顺序.