与Numpy的einsum和tensordot相同的操作

时间:2017-01-25 09:48:34

标签: python numpy vectorization

假设我有两个形状AB的{​​{1}}和(3, 4, N)三维数组。

我可以使用

计算沿第三轴的切片之间的点积
(4, 3, N)

是否可以使用with_einsum = np.eisum('ikl,kjl->ijl', A, B) 执行相同的操作?

1 个答案:

答案 0 :(得分:1)

对于np.einsum('ikl,kjl->ijl', A, B),存在轴对齐要求,字符串 - l与输入和输出保持一致。因此,使用np.tensordot可能不一定会导致性能提升,但由于问题已明确要求,所以我们无论如何都要提出建议。现在,np.tensordot会将不参与和减少的轴展开为单独的轴,从而产生(N,N)。因此,为了得到最终输出,我们需要沿展开轴的对角线提取元素。

以下是np.tensordot的解决方案的样子 -

mask = np.eye(N,dtype=bool)
out = np.tensordot(A,B,axes=((1),(0))).swapaxes(1,2)[:,:,mask]

有些情况下np.dot/np.tensordot可能会成为赢家,但这要求减少轴的长度合适。有关更详细的分析,请参阅this post

对于给定的问题,情况并非如此,因为总和减少的长度仅为4。所以,我认为einsum在这里最好!