Python 在一定维度上所有元素组合的乘法

Python 在一定维度上所有元素组合的乘法,python,pytorch,batch-processing,multiplication,Python,Pytorch,Batch Processing,Multiplication,我试着把某个维度上所有元素的组合进行乘法。 例如 使用for循环将是 for a,i in enumerate(A): for b,j in enumerate(B): c[i][j] = a[1]*b[0] 不使用for循环将是错误的 A[:,None,1]*B[:,0] 这对于二维(A.shape=(4,2),B.shape=(4,2))很有效 然而,当我将上述过程扩展到三维时(A.shape=(2,4,2),B.shape=(2,4,2)) 我试过了 A[:,

我试着把某个维度上所有元素的组合进行乘法。 例如 使用for循环将是

for a,i in enumerate(A):
    for b,j in enumerate(B):
        c[i][j] = a[1]*b[0]
不使用for循环将是错误的

A[:,None,1]*B[:,0] 
这对于二维(A.shape=(4,2),B.shape=(4,2))很有效

然而,当我将上述过程扩展到三维时(A.shape=(2,4,2),B.shape=(2,4,2))

我试过了

A[:,:,1]*B[:,:,None,0] 
但是给了我一个错误

如果不使用for循环,如何执行此操作

对于二维张量,这就是我得到的

a = torch.FloatTensor([[0,1],[0,2],[0,3],[0,4]])
b = torch.FloatTensor([[1,0],[2,0],[3,0],[4,0]])
c = a[:,None,0] * b[:,1]

print(c)

tensor([[ 1.,  2.,  3.,  4.],
        [ 2.,  4.,  6.,  8.],
        [ 3.,  6.,  9., 12.],
        [ 4.,  8., 12., 16.]])
但在这种情况下

A = torch.cat([a.unsqueeze(0),a.unsqueeze(0)],dim=0)
B = torch.cat([b.unsqueeze(0),b.unsqueeze(0)],dim=0)


C = A[:,:,None,0] * B[:,:,1] << RuntimeError

RuntimeError: The size of tensor a (4) must match the size of tensor b (2) at non-singleton dimension 1

如果不在维度0中使用for循环,我想不出一种方法来实现这一点。

请始终发布错误消息和整个stacktrace。@Sukwon,你能给我一个小表格,例如3x3,说明你到底想计算什么吗?顺便说一句,你的第一个例子就是特定列的外积:
torch.outer(a[:,1],B[:,0])
。3维的预期输出形状是什么<代码>(2,4,2,4)?@aerijman添加了示例@Berriel我预计输出形状为(2,4,4,1)
tensor([[[ 1.,  2.,  3.,  4.],
         [ 2.,  4.,  6.,  8.],
         [ 3.,  6.,  9., 12.],
         [ 4.,  8., 12., 16.]],

        [[ 1.,  2.,  3.,  4.],
         [ 2.,  4.,  6.,  8.],
         [ 3.,  6.,  9., 12.],
         [ 4.,  8., 12., 16.]]])