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)