沿numpy张量点的最后一个轴收缩

时间:2019-09-03 13:02:06

标签: python python-3.x numpy

我对张量代数不是很熟悉,并且在理解如何使numpy.tensordot做我想做的事情时遇到困难。

我正在使用的示例很简单:给定一个张量为a的张量(2,2,3)和另一个b形状为(2,1,3)的张量,我想要一个结果张量{{1 }},形状为c。该张量将是以下等效的python代码的结果:

(2,1)

文档说可选参数n = a.shape[2] c = np.zeros((2,n)) for k in range(n): c += a[:,:,k]*b[:,:,k]

  

如果为int N,则按顺序对a的最后N个轴和b的前N个轴求和。相应轴的大小必须匹配。

但是我不明白这里需要哪些“轴”(此外,当轴是一个元组或一个元组的元组时,它会变得更加混乱)。例子对我也不是很清楚。

1 个答案:

答案 0 :(得分:1)

采用tensordot works的方式,由于沿第一个轴的对齐要求,因此在这里(至少不能直接使用)不起作用。您可以使用np.einsum解决问题-

c = np.einsum('ijk,ilk->ij',a,b)

或者,使用np.matmul / @-operator(Python 3.x)-

np.matmul(a,b.swapaxes(1,2))[...,0] # or (a @ b.swapaxes(1,2))[...,0]