Python 向量(1 x N)乘以张量(N x M x M)

Python 向量(1 x N)乘以张量(N x M x M),python,arrays,numpy,pytorch,matrix-multiplication,Python,Arrays,Numpy,Pytorch,Matrix Multiplication,我正在寻找numpy中的矩阵运算,或者最好是pytorch中的矩阵运算,它允许一个向量(1xn)乘以张量(nxmxm)得到(1xm)。使用for循环很容易做到这一点,但是for循环不允许在训练期间进行反向传播。我尝试在numpy和pytorch中使用matmul(以及dot和bmm等其他一些工具),但都没有成功。下面是一个示例(其中M=2,但在我的用例中是256),说明了我正在尝试做的事情: a = np.array([1,2,3]) b = np.array([[[1,2],[3,4]],[[

我正在寻找numpy中的矩阵运算,或者最好是pytorch中的矩阵运算,它允许一个向量(1xn)乘以张量(nxmxm)得到(1xm)。使用for循环很容易做到这一点,但是for循环不允许在训练期间进行反向传播。我尝试在numpy和pytorch中使用matmul(以及dot和bmm等其他一些工具),但都没有成功。下面是一个示例(其中M=2,但在我的用例中是256),说明了我正在尝试做的事情:

a = np.array([1,2,3])
b = np.array([[[1,2],[3,4]],[[5,6],[7,8]],[[9,10],[11,12]]])
我想执行以下操作:
1*[[1,2],[3,4]]+2*[[5,6],[7,8]]+3*[[9,10],[11,12]
,这可以通过以下for循环实现:

for i in range(3):
  matrix_sum += a[i]*b[i]

任何建议或解决方案都将不胜感激。

Numpy和pytorch是基于矩阵乘法构建的

火炬示例:

A = torch.rand(1, N)
B = torch.rand(N, M, M)

C = A @ B.transpose(0, 1) 
C.transpose_(0, 1)
C.shape
torch.size(1, M, M)
同样,对于numpy:

A = np.random.randn(1, N)
B = np.random.randn(N, M, M)

C = A @ B.transpose(1, 0, 2)
C = C.transpose(1, 0, 2)
C.shape
(1, M, M)
编辑为爱因桑人:

Pytorch和numpy处理einsum的方式基本相同:

torch.einsum('i,ijk->jk', A, B)
np.einsum('i,ijk->jk', A, B)
Pytorch einsum文档:
Numpy einsum文档:

您可以使用简单einsum:

#this gives you 2-D array (M,M)
np.einsum('i,ijk->jk',a,b)
输出:

[[38 44]
 [50 56]]
[[[38 44]
  [50 56]]]
或其他解决方案:

#this gives you 3-D array (1,M,M)
a[None,:]@b.swapaxes(0,1)
输出:

[[38 44]
 [50 56]]
[[[38 44]
  [50 56]]]

A@B
规则是A的最后一个dim与B的第二个到最后一个配对。
N
是这个维度,所以
B
需要更改为(M,N,M)。我编辑了你的打字错误,但你颠倒了它:D不应该是
转置
而不是
转置