假设我有两个形状A
和B
的{{1}}和(3, 4, N)
三维数组。
我可以使用
计算沿第三轴的切片之间的点积(4, 3, N)
是否可以使用with_einsum = np.eisum('ikl,kjl->ijl', A, B)
执行相同的操作?
答案 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
在这里最好!