tensordot
NumPy和函数之间的异同einsum
有据可查,并在本论坛中进行了广泛讨论(例如[1]、[2]、[3]、[4]、[5])。但是,我遇到了一个使用矩阵乘法的实例einsum
,我发现使用它进行复制非常困难,如果不是不可能的话tensordot
:如果我们的两个数组是,
>>> A = np.array([[0, 1], [1, 0]])
>>> B = np.arange(2 ** 4).reshape((2, 2, 2, 2))
是否存在tensordot
与以下内容等效的一行?
>>> np.einsum("ab,ibjk->iajk", A, B)
array([[[[ 4, 5],
[ 6, 7]],
[[ 0, 1],
[ 2, 3]]],
[[[12, 13],
[14, 15]],
[[ 8, 9],
[10, 11]]]])
根据我的发现,答案似乎是“不”。问题出现在输出维度的索引中iajk
。在这里,a
arrayA
的维度出现在维度i
和j
array之间B
。如果输出维度的索引改为aijk
,np.tensordot(A, B, (1, 1))
则可以正常工作。为了确定,我使用所有可能的轴进行了测试,
>>> output_einsum = np.einsum("ab,ibjk->iajk", A, B)
>>> axes_A = [-2, -1, 0, 1]
>>> axes_B = [-4, -3, -2, -1, 0, 1, 2, 3]
>>> for i in axes_A:
... for j in axes_B:
... output_tensordot = np.tensordot(A, B, axes=(i, j))
... if np.allclose(ouput_einsum, output_tensordot):
... print(i,j)
...
并发现没有任何允许的轴组合产生预期的结果。请注意,B
将参数的每个元素的尺寸限制axes
为长度为 1。einsum
使用交错输出维度的函数不能在一行中重现是否正确tensordot
?如果是这样,是否存在多行解决方法?