【发布时间】:2017-05-23 18:02:40
【问题描述】:
import numpy as np
mat1 = np.random.rand(2,3)
mat2 = np.random.rand(2,5)
我希望得到一个 2x3x5 的张量,其中每一层都是 3x5 的外积,通过将 mat1 的 3x1 转置行乘以 mat2 的 1x5 行来实现。
用numpy matmul可以做到吗?
【问题讨论】:
import numpy as np
mat1 = np.random.rand(2,3)
mat2 = np.random.rand(2,5)
我希望得到一个 2x3x5 的张量,其中每一层都是 3x5 的外积,通过将 mat1 的 3x1 转置行乘以 mat2 的 1x5 行来实现。
用numpy matmul可以做到吗?
【问题讨论】:
您可以在使用np.newaxis/None 扩展尺寸后简单地使用broadcasting -
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)
【讨论】: