Numpy 张氏混淆

Numpy 张氏混淆,numpy,Numpy,我可能误解了张力或。我试着做以下部分收缩: c(e,q,i,j) = a(e,q,i,j,k,l) * b(e,q,l,k) 使用 但它给了我错误 /usr/local/lib/python3.7/site-packages/numpy/core/numeric.py in tensordot(a, b, axes) 1282 else: 1283 for k in range(na): -> 1284 if as_[axes_

我可能误解了
张力或
。我试着做以下部分收缩:

c(e,q,i,j) = a(e,q,i,j,k,l) * b(e,q,l,k)
使用

但它给了我错误

/usr/local/lib/python3.7/site-packages/numpy/core/numeric.py in tensordot(a, b, axes)
   1282     else:
   1283         for k in range(na):
-> 1284             if as_[axes_a[k]] != bs[axes_b[k]]:
   1285                 equal = False
   1286                 break

IndexError: tuple index out of range

我误解了什么?

我们希望保持少数轴对齐。因此,
tensordot
不会直接起作用。相反,我们可以使用
np.einsum
-

np.einsum('ijklmn,ijnm->ijkl',a,b)

[4,3]
代表
b
,它没有
4
@Divakar,所以它应该是
c=np.tensordot(a,b,axes=([5,4],[2,3])
?但这也不起作用,因为输出形状是
(1,4,2,2,1,4)
,而它应该是
(1,4,2,2)
。看起来您希望保持几个轴对齐。所以,寻找einsum/matmul。@Divakar谢谢。因此,如果使用
tensordot
tensordot
组合使用整形和转置将计算减少到
dot
。因此,就像
dot
一样,它不能只通过
e,q
维度来保持不变<创建代码>matmul
是为了按照您想要的方式处理前导维度。
np.einsum('ijklmn,ijnm->ijkl',a,b)