np.matmul更改矩阵的尺寸

时间:2018-11-03 09:23:27

标签: python arrays numpy matrix transpose

我有以下具有以下尺寸的数组:

A是(2 x 1 x 10)。一般形式为(N x 1 x D)

B是(30 x 10)

我需要使用np.matmul来制作它们的点积,以使matmul将A的形状为1xD的N个矩阵与另一个自变量B相乘。 / p>

从A和B的尺寸来看,应该认为我需要在乘法之前对B进行转置,以便可以乘积。

B_transpose = np.transpose(B)

现在,B_transpose是(10 x 30)

但是当我做matmul时:

output = np.matmul(A, B_transpose)

它给我一个错误:

  

ValueError:形状(2,1,10)和(2,1,30)不对齐:10(dim 2)!= 1(dim 1)

实际上,它会更改B_transpose的尺寸,我不知道为什么。它应该是(10 x 30)。我用B_transpose.shape进行了检查,就是这样。但是当相乘时,它将转换为(2 x 1 x 30)。为什么会这样?

谢谢。

1 个答案:

答案 0 :(得分:0)

据我所知,您可以使用numpy.einsum轻松地实现它:

import numpy as np

A = np.random.random((2, 1, 10))
B = np.random.random((30,10))

C=np.einsum('ijk,lk->ijl', A, B)
print(C)

print("shape of A: "+ str(A.shape))
print("shape of B: "+str(B.shape))
print("shape of C: "+str(C.shape))

输出:

[[[2.24297933 1.90535058 1.64265642 2.017492   1.64335181 1.92980808
   2.49041745 3.34348547 1.99242493 2.48508664 1.46283295 2.32082231
   2.68276213 1.58709381 1.22955766 1.46049189 1.66621528 1.62563277
   2.0199153  2.06292694 1.74791187 2.80959004 1.66948659 1.87064246
   1.4671402  1.83211074 1.70360887 2.13277365 2.0971552  1.89335019]]

 [[3.05604669 3.21934434 1.77297603 2.61009216 2.94784787 3.44622224
   3.13340867 5.00977942 3.55128091 3.75517549 2.71985505 3.84420034
   4.03311806 2.56002937 1.726476   2.53251146 3.43982974 2.2561291
   3.63013679 3.23935523 2.84565586 4.21606203 2.49771182 3.11465742
   2.48485314 3.62590865 2.96567419 3.00654852 3.20750017 3.1852716 ]]]
shape of A: (2, 1, 10)
shape of B: (30, 10)
shape of C: (2, 1, 30)