我试图用三维张量的正面切片进行矩阵乘法,如下所示。如果X.shape == (N, N)和Y.shape == (N, N, Y),则产生的张量应该是(N, N, Y)形状的。
实现这一目标的适当np.tensordot语法是什么?
我试图将自己限制在np.tensordot上,而不是np.einsum上,因为我以后想把这个解决方案翻译成Theano。不幸的是,Theano还没有实现np.einsum。

图形改编自本论文关于张量乘法。非张力点的答案等价于以下内容
tensor = np.random.rand(3, 3, 2)
X = np.random.rand(3, 3)
output = np.zeros((3, 3, 2))
output[:, :, 0] = X.dot(tensor[:, :, 0])
output[:, :, 1] = X.dot(tensor[:, :, 1])发布于 2016-03-17 21:45:19
axis=1表示X和axis=0表示tensor,因此基于np.tensordot的解决方案将是-
np.tensordot(X,tensor, axes=([1],[0]))解释:
让我们以迭代解决方案作为解释,并在其中进行第一次迭代:
output[:, :, 0] = X.dot(tensor[:, :, 0])在点积中,第一个输入是X,它的形状是(N x N),第二个输入是tensor[:, :, 0],它是沿着最后一个轴的第一个切片,形状是(N x N)。该点积导致沿X的第二轴,即axis=1和沿第一轴,即tensor[:, :, 0]的axis=0减小,这也恰好是整个阵列tensor的第一轴。现在,这在所有迭代中都会继续。因此,即使在全局情况下,我们也需要这样做:在X中减少/丢失X,在张量中减少/丢失axis=0,就像我们所做的那样!
整合@hlin117的答案
np.tensordot(X,tensor, axes=([1],[0]))时间安排:
>>> N = 200
>>> tensor = np.random.rand(N, N, 30)
>>> X = np.random.rand(N, N)
>>>
>>> %timeit np.tensordot(X, tensor, axes=([1], [0]))
100 loops, best of 3: 14.7 ms per loop
>>> %timeit np.tensordot(X, tensor, axes=1)
100 loops, best of 3: 15.2 ms per loop发布于 2016-03-17 21:46:36
上面的内容相当于以下内容:
np.tensordot(X, tensor, axes=1)axes=1,因为(如果axes参数是标量的话) N应该是第一个参数的最后一个轴,而N应该是第二个参数的第一个轴。
https://stackoverflow.com/questions/36072042
复制相似问题