我尝试使用3D张量的正面切片执行矩阵乘法,如下所示。如果X.shape == (N, N)
和Y.shape == (N, N, Y)
,生成的张量应该是(N, N, Y)
的形状。
实现此目的的正确np.tensordot
语法是什么?
我试图将自己限制在np.tensordot
,而不是np.einsum
,因为我想稍后将此解决方案转换为Theano。不幸的是,Theano尚未实施np.einsum
。
图形改编自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])
答案 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
应该是第一个轴的第一个轴第二个论点。