【问题标题】:How do I multiply a 3D matrix and 2D matrix using numpy in Python?如何在 Python 中使用 numpy 将 3D 矩阵和 2D 矩阵相乘?
【发布时间】:2019-11-15 14:29:28
【问题描述】:
我的 3d 数组的形状是 (3, 2, 3),我的 2d 数组是 (2, 3)。我想要进行的乘法是 np.dot(2d, 3d[i,:,:].T) 所以它应该返回一个形状为 (3, 2, 2) 的结果。我可以写一个循环,但这不是最有效的方法,我读过有一个名为 np.tensordot 的操作,但它适用于我的情况吗?如果是,它将如何工作?
【问题讨论】:
标签:
python
arrays
numpy
matrix
【解决方案1】:
我们可以使用np.einsum -
# a, b are 3D and 2D arrays respectively
np.einsum('ijk,lk->ilj', a, b)
或者,np.matmul/@-operator on Python3.x -
np.matmul(a,b.T[None]).swapaxes(1,2)
【解决方案2】:
你确实可以使用tensordot:
np.tensordot(a2D,a3D,((-1,),(-1,))).transpose(1,0,2)
或
np.tensordot(a3D,a2D,((-1,),(-1,))).transpose(0,2,1)
缺点:由于我们最终必须对轴进行洗牌,结果数组将是不连续的。如果我们在乘法之前进行洗牌,我们可以使用einsum 来避免这种情况,如@Divakar 或矩阵乘法所示,即:
a2D@a3D.transpose(0,2,1)