【发布时间】:2021-11-20 06:35:14
【问题描述】:
如果我想计算矩阵-矩阵乘积a*b,我会做a@b 或np.dot(a,b)
a = np.random.rand(2,2)
b = np.random.rand(*a.shape)
c = a@b
c.shape
>>> (2,2)
一般来说,我可以使用 tensordot 来做同样的事情:
c = np.tensordot(a,b,1)
c.shape
>>> 2,2
但是,如果我向 a 和 b 添加一个维度,我将不再得到我想要的结果(另一个 2,2,3 数组):
a = np.random.rand(2,2,3)
b = np.random.rand(*a.shape)
c = np.tensordot(a,b,1)
c.shape
>>> ValueError: shape-mismatch for sum
我尝试的任何轴排列,即使是可怕的b,axes=((0,1),(0,1)),都会导致输出形状不正确,或者由于无法完成计算而导致错误。
有没有办法完成我想做的事情?我的印象是使用 tensordot 会很简单,但似乎不是......
【问题讨论】:
-
tensordot不适合批处理。使用matmul/@或einsum -
关于如何 让这些功能完成我所追求的工作的任何指导?
-
批次是哪个维度,
dotted是哪个维度? -
假设我想要前两个维度(0 和 1)的矩阵-矩阵乘积,并且要保留任何其他暗淡。如果其他需要通过 reshape 折叠然后重新展开,没关系。
-
matmuldocs 应该明确第一个(3 个)是批次。点规则适用于最后 2。einsum更灵活。
标签: python numpy linear-algebra