用于多个外部产品的 Numpy 运算符
Numpy operator for multiple outer products
import numpy as np
mat1 = np.random.rand(2,3)
mat2 = np.random.rand(2,5)
我希望得到一个 2x3x5 张量,其中每一层都是通过将 mat1 的 3x1 转置行乘以 mat2 的 1x5 行获得的 3x5 外积。
可以用numpy matmul做吗?
您可以简单地使用 broadcasting
after extending their dimensions with np.newaxis/None
-
mat1[...,None]*mat2[:,None]
这将是最高性能的,因为这里不需要 sum-reduction
来保证来自 np.einsum
或 np.matmul
的服务。
如果你还想拖入np.matmul
,它与broadcasting
基本相同:
np.matmul(mat1[...,None],mat2[:,None])
使用 np.einsum
,如果您熟悉它的字符串表示法,它可能看起来比其他的更整洁一些 -
np.einsum('ij,ik->ijk',mat1,mat2)
# 23,25->235 (to explain einsum's string notation using axes lens)
import numpy as np
mat1 = np.random.rand(2,3)
mat2 = np.random.rand(2,5)
我希望得到一个 2x3x5 张量,其中每一层都是通过将 mat1 的 3x1 转置行乘以 mat2 的 1x5 行获得的 3x5 外积。
可以用numpy matmul做吗?
您可以简单地使用 broadcasting
after extending their dimensions with np.newaxis/None
-
mat1[...,None]*mat2[:,None]
这将是最高性能的,因为这里不需要 sum-reduction
来保证来自 np.einsum
或 np.matmul
的服务。
如果你还想拖入np.matmul
,它与broadcasting
基本相同:
np.matmul(mat1[...,None],mat2[:,None])
使用 np.einsum
,如果您熟悉它的字符串表示法,它可能看起来比其他的更整洁一些 -
np.einsum('ij,ik->ijk',mat1,mat2)
# 23,25->235 (to explain einsum's string notation using axes lens)