假设我有两个 3D 数组A
and B
形状的(3, 4, N)
and (4, 3, N)
.
我可以计算沿第三轴的切片之间的点积
with_einsum = np.eisum('ikl,kjl->ijl', A, B)
是否可以执行相同的操作numpy.tensordot
?
With 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 https://stackoverflow.com/a/41443497/3293881进行更详细的分析。
对于给定的问题,情况并非如此,因为求和的长度只是4
。所以,我会想einsum
这里会是最好的!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)