下面是两个矩阵:
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]]
2条答案
按热度按时间ogsagwnx1#
使用单一
试试
np.einsum
(documentation)。如果你想知道更多关于np.einsum
是如何工作的,那么看看这个old answer of mine,它分解了它是如何工作的-使用广播
上述
einsum
等效于以下multiply->reduce->transpose
注意:
a[:,:,None]
在矩阵a
上增加了一个额外的轴,使得(2,2)-〉(2,2,1)。这使得它可以在b
的运算中广播,b
的形状为(2,2,3)。使用Tensor点
查看Tensor点文档here
ws51t4hk2#
相对较新的
matmul
是为了处理这样的“批处理”操作而设计的,3维中的第一个是批处理维,所以我们必须将a
调整为3d。用简单的术语来说
具有添加的
l
维度(其稍后从结果中移除)