Python:将向量列表乘以矩阵列表作为单个矩阵运算
Python: Multiplying a list of vectors by a list of matrices as a single matrix operation
我有一个包含 100 个 N-dimensional
个向量的列表和一个包含 100 MxN
个矩阵的列表。因此,您可以将这两个数据结构视为 100xN
列表(或 numpy 数组)和 100xMxN
列表(或 numpy 数组)。
我想做的是取每个向量与其对应矩阵的点积,这样输出应该是 100 M-dimensional
矩阵(即 100xM
列表或 numpy 数组)。
但是,我不太确定该怎么做。出于明显的效率原因,我不想迭代地进行。我也知道这不是基本的矩阵乘法。我想我可能想使用 np.einsum
,但我不太熟悉它。
有人愿意帮忙吗?
你可以像这样使用np.einsum
-
np.einsum('ij,ikj->ik',a,b)
样本运行-
In [42]: M,N = 3,4
In [43]: a = np.random.rand(100,N)
In [44]: b = np.random.rand(100,M,N)
In [45]: np.einsum('ij,ikj->ik',a,b).shape
Out[45]: (100, 3)
您也可以使用 np.matmul
或 @
运算符 (Python 3.x),尽管它看起来比 einsum
-
稍慢
np.matmul(a[:,None],b.swapaxes(1,2))[:,0]
我有一个包含 100 个 N-dimensional
个向量的列表和一个包含 100 MxN
个矩阵的列表。因此,您可以将这两个数据结构视为 100xN
列表(或 numpy 数组)和 100xMxN
列表(或 numpy 数组)。
我想做的是取每个向量与其对应矩阵的点积,这样输出应该是 100 M-dimensional
矩阵(即 100xM
列表或 numpy 数组)。
但是,我不太确定该怎么做。出于明显的效率原因,我不想迭代地进行。我也知道这不是基本的矩阵乘法。我想我可能想使用 np.einsum
,但我不太熟悉它。
有人愿意帮忙吗?
你可以像这样使用np.einsum
-
np.einsum('ij,ikj->ik',a,b)
样本运行-
In [42]: M,N = 3,4
In [43]: a = np.random.rand(100,N)
In [44]: b = np.random.rand(100,M,N)
In [45]: np.einsum('ij,ikj->ik',a,b).shape
Out[45]: (100, 3)
您也可以使用 np.matmul
或 @
运算符 (Python 3.x),尽管它看起来比 einsum
-
np.matmul(a[:,None],b.swapaxes(1,2))[:,0]