Numpy张量:Tensordot超过张量的正面切片

时间:2016-03-17 21:29:55

标签: python numpy matrix-multiplication

我尝试使用3D张量的正面切片执行矩阵乘法,如下所示。如果X.shape == (N, N)Y.shape == (N, N, Y),生成的张量应该是(N, N, Y)的形状。

实现此目的的正确np.tensordot语法是什么?

我试图将自己限制在np.tensordot,而不是np.einsum,因为我想稍后将此解决方案转换为Theano。不幸的是,Theano尚未实施np.einsum

enter image description here

图形改编自this paper关于张量乘法。 非tenordot答案等同于以下

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])

2 个答案:

答案 0 :(得分:1)

axis=1的{​​{1}}和X的{​​{1}}缩减,因此基于np.tensordot的解决方案将是 -

axis=0

说明:

让我们将您的迭代解决方案用于解释,并在其中进行第一次迭代:

tensor

在点积中,第一个输入为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导致减少,这也恰好是第一轴整个数组axis=0。现在,这在所有迭代中都会继续。因此,即使在大图中,我们也需要这样做:在tensor[:, :, 0]中减少/失去tensor和在张量中减少axis=1,就像我们一样!

整合@ hlin117的答案

X

定时:

axis=0

答案 1 :(得分:1)

看起来上述内容等同于以下内容:

np.tensordot(X, tensor, axes=1)

axes=1,因为(如果axes参数是标量)N应该是第一个参数的最后一个轴,N应该是第一个轴的第一个轴第二个论点。