减少幅度是随着axis=1
for X
and axis=0
for tensor
, thus 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
, i.e. axis=1
并沿着第一轴,即axis=0
of tensor[:, :, 0]
,它也恰好是整个数组的第一个轴tensor
。现在,这在所有迭代中都继续进行。因此,即使在大局中,我们也需要做同样的事情:减少/损失axis=1
in X
and axis=0
在张量中,就像我们一样!
整合@hlin117的答案
np.tensordot(X,tensor, axes=([1],[0]))
Timing:
>>> 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