numpy 2d与3d之间的矩阵乘法?

baubqpgj  于 2023-01-09  发布在  其他
关注(0)|答案(2)|浏览(189)

下面是两个矩阵:
a的形状为(2,2),B的形状为(2,2,3)
我想得到形状为(2,3)的c

如何使用a和B得到c?

a = array([[0.5, 0.5],
           [0.6, 0.4]])

b = array([[[1, 2, 1],
            [1, 3, 1]],

           [[2, 1, 2],
            [3, 1, 3]]])

c = array([[1. , 2.5, 1. ],
           [2.4 , 1.2, 2.4 ]])

# c = [[0.5*1+0.5*1, 0.5*2+0.5*3, 0.5*1+0.5*1],
       [0.6*2+0.4*3, 0.6*1+0.4*1, 0.6*2+0.4*3]]

# [0.5, 0.5] * [[1, 2, 1],
                [1, 3, 1]]
# [0.6, 0.4] * [[2, 1, 2],
                [3, 1, 3]]
ogsagwnx

ogsagwnx1#

使用单一

试试np.einsumdocumentation)。如果你想知道更多关于np.einsum是如何工作的,那么看看这个old answer of mine,它分解了它是如何工作的-

np.einsum('ij,ijk->ik',a,b)

array([[1. , 2.5, 1. ],
       [2.4, 1. , 2.4]])

使用广播

上述einsum等效于以下multiply->reduce->transpose
注意:a[:,:,None]在矩阵a上增加了一个额外的轴,使得(2,2)-〉(2,2,1)。这使得它可以在b的运算中广播,b的形状为(2,2,3)。

(a[:,:,None]*b).sum(1)

array([[1. , 2.5, 1. ],
       [2.4, 1. , 2.4]])

使用Tensor点

查看Tensor点文档here

np.tensordot(a,b, axes=[1,1]).diagonal().T

array([[1. , 2.5, 1. ],
       [2.4, 1. , 2.4]])
ws51t4hk

ws51t4hk2#

相对较新的matmul是为了处理这样的“批处理”操作而设计的,3维中的第一个是批处理维,所以我们必须将a调整为3d。

In [156]: a = np.array([[0.5, 0.5],
     ...:            [0.6, 0.4]])
     ...: 
     ...: b = np.array([[[1, 2, 1],
     ...:             [1, 3, 1]],
     ...: 
     ...:            [[2, 1, 2],
     ...:             [3, 1, 3]]])
In [157]: (a[:,None]@b)[:,0]
Out[157]: 
array([[1. , 2.5, 1. ],
       [2.4, 1. , 2.4]])

用简单的术语来说

np.einsum('ilj,ijk->ik',a[:,None],b)

具有添加的l维度(其稍后从结果中移除)

相关问题