Introduction à eins
eins est une fonction puissante de la bibliothèque NumPy en Python, utilisée pour effectuer des opérations de sommation, de produit et de contraction sur des tableaux multidimensionnels via la notation d'Einstein. Elle permet de manipuler efficacement des tenseurs en spécifiant les indices à sommer ou à conserver.
Fonctionnement de eins
1. Principe de la notation d'Einstein
- La notation d'Einstein simplifie l'écriture des sommes sur indices répétés dans des expressions tensoriales.
- Dans eins, chaque caractère représente un indice d'une dimension du tableau.
- Les indices répétés dans les entrées sont sommés automatiquement.
- Les indices non répétés apparaissent dans la sortie.
2. Syntaxe générale
numpy.einsum(subscripts, *operands, out=None, dtype=None, order='K', casting='safe', optimize=False)
- subscripts : chaîne de caractères décrivant la relation entre indices des opérandes et de la sortie.
- operands : un ou plusieurs tableaux NumPy.
- out : tableau optionnel pour stocker le résultat.
- dtype : type de données du résultat.
- optimize : booléen ou chaîne pour optimiser l'ordre des opérations.
Utilisations courantes de eins
| Opération | Exemple eins | Description |
|---|---|---|
| Somme sur un axe | np.einsum('i->', a) | Somme de tous les éléments de a |
| Produit scalaire | np.einsum('i,i->', a, b) | Produit scalaire entre vecteurs a et b |
| Produit matriciel | np.einsum('ij,jk->ik', A, B) | Multiplication de matrices A et B |
| Transposition | np.einsum('ij->ji', A) | Transpose de la matrice A |
| Trace d'une matrice | np.einsum('ii', A) | Somme des éléments diagonaux de A |
| Produit tensoriel | np.einsum('i,j->ij', a, b) | Produit extérieur de vecteurs |
Détails sur la notation des indices
- Chaque opérande est associé à une chaîne d'indices (lettres minuscules).
- Les indices répétés dans un même opérande indiquent une diagonale (ex :
'ii'pour la diagonale). - Les indices répétés entre opérandes indiquent une contraction (somme sur cet indice).
- Les indices présents uniquement dans la sortie sont conservés.
- Exemple :
'ij,jk->ik'signifie contraction sur l'indicej.
Avantages et limites de eins
1. Avantages
- Flexibilité : permet d'exprimer des opérations complexes sur tenseurs en une seule ligne.
- Performance : souvent plus rapide que des boucles explicites ou des combinaisons d'opérations NumPy.
- Lisibilité : notation concise et mathématiquement intuitive.
2. Limites
- Syntaxe parfois difficile à maîtriser pour les débutants.
- Peut être moins lisible pour des opérations très complexes sans commentaires.
- Optimisation automatique parfois nécessaire pour les calculs lourds.
Optimisation avec eins
- L'argument
optimize=Trueou une chaîne spécifique permet à NumPy de déterminer l'ordre optimal des contractions. - Utile pour les opérations sur plusieurs tenseurs ou de grande taille.
- Exemple :
np.einsum('ij,jk,kl->il', A, B, C, optimize=True)
Exemples pratiques
1. Exemple 1 : Somme des éléments d'un vecteur
import numpy as np
a = np.array([1, 2, 3])
somme = np.einsum('i->', a) # Résultat : 6
2. Exemple 2 : Produit matriciel
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = np.einsum('ij,jk->ik', A, B) # Résultat : [[19, 22], [43, 50]]
3. Exemple 3 : Trace d'une matrice
trace = np.einsum('ii', A) # Résultat : 1 + 4 = 5
À retenir : La fonction
numpy.einsumutilise la notation d'Einstein pour effectuer des opérations de contraction et de sommation sur des tableaux multidimensionnels, offrant une syntaxe concise et performante pour manipuler des tenseurs.