我对张量代数不是很熟悉,并且在理解如何使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个轴求和。相应轴的大小必须匹配。
但是我不明白这里需要哪些“轴”(此外,当轴是一个元组或一个元组的元组时,它会变得更加混乱)。例子对我也不是很清楚。
答案 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]