二维矩阵“切片”的元素相乘形成三维矩阵

2024-04-26 14:48:19 发布

您现在位置:Python中文网/ 问答频道 /正文

像这样的矩阵乘法

enter image description here

使用numpy很容易在Python中实现

import numpy as np
np.array([[1, 2, 3]]) * np.array([[1], [2], [3]])

array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])

但在我的情况下,我有两个二维矩阵,我想把它们相乘形成一个3D矩阵。实际上,二维矩阵的第一个“切片”是一个数组,我想用第二个矩阵的第一个“切片”相乘,形成一个二维矩阵。对于2D矩阵的所有“切片”都是如此。第一个维度是[x,z],第二个维度是[y,z]。我想把它们相乘得到[x,y,z]。在numpy中有没有一种优雅的方法来做到这一点?在


Tags: 方法importnumpyasnp情况切片矩阵
2条回答

我设法通过对this StackOverflow question的响应来解决这个问题。在

arr = np.array([[1, 2, 3]])
arr * arr.T

array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])

mat = np.repeat(arr, 3, axis=0)
mat

array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

mat[:,:,None] * np.transpose(mat[:,None,:], axes=(1, 0, 2))

array([[[1, 2, 3],
        [2, 4, 6],
        [3, 6, 9]],

       [[1, 2, 3],
        [2, 4, 6],
        [3, 6, 9]],

       [[1, 2, 3],
        [2, 4, 6],
        [3, 6, 9]]])

因为你已经可以把你的乘法描述为

[x, z] * [y, z] -> [x, y, z]

最直接的解决方案很可能是使用Einsum:

^{pr2}$

另一种选择是简单地使用广播

D = A[:, None, :] * B[None, :, :]
np.allclose(D, C)
# True

相关问题 更多 >