pythonのnumpyで行列の縮約計算をして次元が3の配列を作成したいのですが、
縮約の順番を変更しても、計算結果が一致するようにしたいです。
やりたいことは、下の配列
A1[2,2],A2[2,2,2],
B1[2,2,2],B2[2,2,2,2],
C1[2,2],C2[2,2,2]
があり、
A1->B1->C1->A2->B2->C2と縮約した結果がD[2,2,2]となるときに、縮約順番を変更して、
A1->A2を縮約して次元をそろえた配列A[2,4]
B1->B2を縮約して次元をそろえた配列B[4,2,4]
C1->C2を縮約して次元をそろえた配列C[4,2]
を用意して、A->B->Cを縮約した結果E[2,2,2]と配列の要素がDと同じになるように計算したいです。
やったこととして、Dの計算はcode1にEの計算はcode2に記載しました。
次元もそろえているのですが、なぜ一致しないのでしょうか?
code1
1A1 = np.arange(4).reshape(2,2) 2B1 = np.arange(8).reshape(2,2,2) 3C1 = np.arange(4).reshape(2,2) 4 5A2 = np.arange(8).reshape(2,2,2) 6B2 = np.arange(16).reshape(2,2,2,2) 7C2 = np.arange(8).reshape(2,2,2) 8 9D = np.einsum("ia,abj->ijb",A1,B1) 10D = np.einsum("ijb,kb->ijk",D,C1) 11D = np.einsum("ijk,uia->ujka" ,D,A2) 12D = np.einsum("ujka,vjab->uvkb",D,B2) 13D = np.einsum("uvkb,wkb->uvw" ,D,C2) 14print(D)
D出力結果
1[[[ 23232 65840]2 [ 68576 196944]]3 4 [[ 65440 185232]5 [198592 570032]]]
code2
1A1 = np.arange(4).reshape(2,2) 2B1 = np.arange(8).reshape(2,2,2) 3C1 = np.arange(4).reshape(2,2) 4 5A2 = np.arange(8).reshape(2,2,2) 6B2 = np.arange(16).reshape(2,2,2,2) 7C2 = np.arange(8).reshape(2,2,2) 8 9A = np.einsum("icb,ca->iab",A2,A1) 10A = np.reshape(A,(2,4)) 11 12B = np.einsum("iebd,aec->icabd",B2,B1) 13B = np.reshape(B,(2,4,4)) 14 15C = np.einsum("icb,ca->iab",C2,C1) 16C = np.reshape(C,(2,4)) 17 18E = np.einsum("ia,jab,kb->ijk",A,B,C) 19 20print(E)
E出力結果
1[[[ 23904 67904] 2 [ 68000 193408]] 3 4 [[ 64096 182080] 5 [181408 515968]]]

0 コメント