Einsteins Vereinbarung und einsum

Überraschenderweise gibt es im russischsprachigen Segment des Internets fast kein Material, das Einsteins Summierungsvereinbarung in verstĂ€ndlicher Sprache erklĂ€rt . Es ist nicht weniger ĂŒberraschend, dass es noch weniger Materialien gibt, um zu verstehen, wie die einsum-Funktion im russischsprachigen Internet funktioniert. Auf Englisch gibt es eine ziemlich detaillierte Antwort ĂŒber die Arbeit von einsum am StapelĂŒberlauf, und auf Russisch gibt es nur wenige Websites, die eine KurvenĂŒbersetzung dieser Antwort liefern. Ich möchte dieses Problem mit einem Mangel an Materialien beheben und alle Interessierten einladen, es zu lesen!






Diskussion des Einstein-Abkommens

ZunĂ€chst möchte ich darauf hinweisen, dass Einsteins Übereinstimmung am hĂ€ufigsten in der Tensoranalyse und ihren Anwendungen verwendet wird. Daher wird es im weiteren Verlauf des Artikels mehrere Verweise auf Tensoren geben.

Wenn Sie gerade erst anfangen, mit Tensoren zu arbeiten, können Sie verwirrt sein, dass zusĂ€tzlich zu den ĂŒblichen Indizes auch hochgestellte Indizes verwendet werden, die zunĂ€chst allgemein als Potenzierung verwendet werden können. Beispiel:

"a mit hochgestelltem i" wird geschrieben als a ^ iund "a in einem Quadrat mit hochgestelltem i" wird geschrieben (a ^ i) ^ 2. Es mag zunÀchst verwirrend und unangenehm sein, aber Sie können sich mit der Zeit daran gewöhnen.





Vereinbarung: weiter im Artikel werden Objekte des Typs a_ix_ioder a_ix ^ iich sie Begriffe nennen .





Worum geht es in Einsteins Vereinbarung?

Einsteins Vereinbarung soll die Anzahl der Summationszeichen in einem Ausdruck reduzieren. Es gibt drei einfache Regeln, die bestimmen, wie korrekt ein Ausdruck in Einsteins Notation geschrieben ist.





Regel 1: Die Summierung erfolgt ĂŒber alle Indizes, die in einem Term zweimal wiederholt werden.



Beispiel: Betrachten Sie einen Ausdruck wie diesen:





\ sum_ {i = 1} ^ 3 a_ix_i = a_1x_1 + a_2x_2 + a_3x_3

Mit Einsteins Konvention kann dieser Ausdruck folgendermaßen umgeschrieben werden:





a_ix_i \ text {oder} a_ix ^ i

So werden wir das Summenzeichen los und schreiben nur einen einzelnen Term. Beachten Sie, dass in diesem Begriff der Index i zweimal wiederholt wird, was bedeutet, dass gemĂ€ĂŸ der ersten Regel verstanden wird, dass die Summierung ĂŒber den Index i bzw. ĂŒber alle möglichen Werte durchgefĂŒhrt wird, die dieser Index annimmt.







: A \ in \ mathbb {R} ^ {m \ times n} v \ in \ mathbb {R} ^ {n}. b \ in \ mathbb {R} ^ {m}. :





b_i = \ sum \ limit_ {j = 1} ^ n A_ {ij} v_j, ~ i = 1, \ ldots, m

:





b_i = A_ {ij} v_ {j} = A_ {ij} v ^ {j}

, i , j , , j.





1. , , .





2. , .





, , ,





  1. .





  2. , .





, Python:





for i in range(M):
    for j in range(N):
        b[i] += A[i, j] * v[j]
      
      



, , . j , i – . . j .





№ 2. .





, a_ {ij} b_ {ij}, a_ {ii} b_ {ij} a_ {ij} b_ {jj}, , .

:





a_i ^ i– i , .. ;





a_i ^ {jj}– i , j – ;





a_ {ii} ^ {jj}– i, j ;





a_ {ij} ^ {ij}– i, j ;





a_ {ii} ^ {ij}– ( i );





, , , . :





a_ {ij} b_ {i} + a_ {ji} b_ {j}

, , . , , , i 3 , j, , , ( ), , .





№ 3. , .





:





b_i = A_ {ij} v_ {j}– , i , ;





a_i = A_ {ki} B_ {kj} x_ {j} + C_ {ik} u_ {k}– . : k j , , , i , , . k , i – , , k – , i – . i , , . : i , , 3 .





, :





x_i = A_ {ij}– i , i j;





x_j = A_ {ik} u_k– j, i. ;





x_i = A_ {ik} u_k + c_j– i, i, j;





:

EIN – . , :





A_ {i_1i_2i_3i_4i_5} = \ sum_ {j_4 = 1} ^ {R_4} \ sum_ {j_3 = 1} ^ {R_3} \ sum_ {j_2 = 1} ^ {R_2} \ sum_ {j_1 = 1} ^ {R_1} G. ^ {(1)} _ {i_1j_1} G ^ {(2)} _ {j_1i_2j_2} G ^ {(3)} _ {j_2i_3j_3} G ^ {(4)} _ {j_3i_4j_4} G ^ {(5)} _ {j_4i_5}

, G ^ {(k)}, R_i. – . , .

, i_1, i_2, i_3, i_4, i_5, , j_1, j_2, j_3, j_4. , , , , . , G ^ {(k)}, (k). , , . :





A_ {i_1i_2i_3i_4i_5} = \ left (G ^ {(1)} \ right) _ {i_1j_1} \ left (G ^ {(2)} \ right) _ {i_2j_2} ^ {j_1} \ left (G ^ {( 3)} \ rechts) _ {i_3j_3} ^ {j_2} \ links (G ^ {(4)} \ rechts) _ {i_4j_4} ^ {j_3} \ links (G ^ {(5)} \ rechts) _ { i_5} ^ {j_4}

, !





einsum

einsum , Python (NumPy, TensorFlow, PyTorch). , , ( , ), , einsum . NumPy. einsum . , , , , .





: A \ in \ mathbb {R} ^ {3 \ times5}, B \ in \ mathbb {R} ^ {5 \ times2} – , . M \ in \ mathbb {R} ^ {3 \ times2}, , :





M_ {ij} = \ sum_ {k = 1} ^ {5} A_ {ik} B_ {kj} = A_ {ik} B_ {kj}

. , :





M = np.zeros((3, 2))
for i in range(3):
    for j in range(2):
        for k in range(5):
            M[i, j] += A[i, k] * B[k, j]
      
      



, einsum :





M = np.einsum("ik,kj->ij", A, B)
      
      



, . einsum : , . :





"{, },{, }->{, }"





einsum :





  • ( ), ;





  • , ;





  • 3 ;





, einsum , , , . , , , , einsum . , einsum.





, einsum:





einsum,

1. :





vector = np.array([1, 2, 3, 4, 5])
result = np.einsum("i->", vector)
print(result)
      
      



Output

15





2. :





matrix = np.array([[1, 2], [3, 4], [5, 6]])
result = np.einsum("ij->", matrix)
print(result)
      
      



Output

21





3. :





matrix = np.array([[1, 2], [3, 4], [5, 6]])
result = np.einsum("ij->j", matrix)
print(result)
      
      



Output

[9, 12]





4. :





matrix = np.array([[1, 2], [3, 4], [5, 6]])
result = np.einsum("ij->i", matrix)
print(result)
      
      



Output

[3, 7, 11]





5. ( , , , ):





matrix = np.array([[1, 2], [3, 4], [5, 6]])
result = np.einsum("ij->ji", matrix)
print(result)
      
      



Output

[[1, 3, 5], [2, 4, 6]]





6. :





matrix = np.array([[1, 2], [3, 4], [5, 6]])
vector = np.array([[1, 2]])
result = np.einsum("ij,kj->ik", matrix, vector)
print(result)
      
      



, 1 mal 2, , . einsum , , , .





Output

[[5], [11], [17]]





7. :





matrix1 = np.array([[1, 2], [3, 4], [5, 6]])
matrix2 = np.array([[1, 0], [0, 1]])
result = np.einsum("ik,kj->ij", matrix1, matrix2)
print(result)
      
      



Output

[[1, 2], [3, 4], [5, 6]]





8. :





vector1 = np.array([[1, 2, 3]])
vector2 = np.array([[1, 1, 1]])
result = np.einsum("ik,jk->", vector1, vector2)
print(result)
      
      



Output

6





9. :





matrix1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
result = np.einsum("ii->", matrix1)
print(result)
      
      



Output

15





10. () :





matrix1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix2 = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
result = np.einsum("ij,ij->ij", matrix1, matrix2)
print(result)
      
      



, , : , einsum – :





result = np.zeros(matrix1.shape, dtype="int32")
for i in range(result.shape[0]):
    for j in range(result.shape[1]):
        result[i, j] += matrix1[i, j] * matrix2[i, j]
print(result)
      
      



Output

[[1, 0, 0], [0, 5, 0], [0, 0, 9]]





11. () :





vector1 = np.array([1, 2, 3])
vector2 = np.array([1, 0, 0])
result = np.einsum("i,j->ij", vector1, vector2)
print(result)
      
      



Output

[[1, 0, 0], [2, 0, 0], [3, 0, 0]]





12. :





A = np.array([[[0, 1], [1, 2], [2, 3]], [[1, 2], [2, 3], [3, 4]], [[2, 3], [3, 4], [4, 5]]])
result = np.einsum("ijk->jki", A)
print(result)
      
      



Output

[[[0, 1, 2], [1, 2, 3]], [[1, 2, 3], [2, 3, 4]], [[2, 3, 4], [3, 4, 5]]]





13. :





A = np.array([[[0, 1], [1, 2], [2, 3]], [[1, 2], [2, 3], [3, 4]], [[2, 3], [3, 4], [4, 5]]])
U = np.array([[1, 2], [2, 3]])
result = np.einsum("ijk,nk->ijn", A, U)
print(result)
      
      



Output

[[[2, 3], [5, 8], [8, 13]], [[5, 8], [8, 13], [11. 18]], [[8, 13], [11, 18], [14, 23]]]





, einsum . , (np.dot, np.outer, np.tensordot, np.transpose, np.cumsum ..), einsum. , , , , , .





einsum ( ).





Einsteins Vereinbarung (Basis)





Einsteins Zustimmung (fortgeschrittener Teil)








All Articles