Dans NumPy, les fonctions comme 𝐧𝐩.𝐬𝐮𝐦() , 𝐧𝐩.𝐦𝐞𝐚𝐧() et 𝐧𝐩.𝐦𝐚𝐱() ont le paramètre 𝐚𝐱𝐢𝐬 , qui permet de définir la cible de l’opération : le tableau entier, colonne par colonne, ligne par ligne ou d’autres dimensions.
La signification du terme « hache » dans NumPy est expliquée dans le glossaire de la documentation officielle comme suit :
hache
Autre terme pour une dimension de tableau. Les axes sont numérotés de gauche à droite ; l’axe 0 est le premier élément du tuple de forme. Glossaire – hache — Manuel NumPy v1.26
Cet article explique la signification et l’utilisation du paramètre𝐚𝐱𝐢𝐬 dans NumPy.
La version de NumPy utilisée dans cet article est la suivante. Notez que les fonctionnalités peuvent varier selon les versions.
import numpy as np print(np.__version__) # 1.26.1
Dans un tableau 2D, 𝐚𝐱𝐢𝐬=0 fonctionne par colonne, 𝐚𝐱𝐢𝐬=1 fonctionne par ligne
Dans un tableau bidimensionnel, 𝐚𝐱𝐢𝐬=0 fonctionne par colonne et 𝐚𝐱𝐢𝐬=1 fonctionne par ligne.
Par exemple, utilisez 𝐧𝐩.𝐬𝐮𝐦() pour calculer la somme.
a = np.arange(12).reshape(3, 4) print(a) # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]] print(np.sum(a, axis=0)) # [12 15 18 21] print(np.sum(a, axis=1)) # [ 6 22 38]
La valeur par défaut est 𝐚𝐱𝐢𝐬=N𝐨𝐧𝐞 , qui fonctionne sur l’ensemble du tableau.
print(np.sum(a)) # 66 print(np.sum(a, axis=None)) # 66
Une erreur est générée si un axe en dehors des dimensions du tableau est spécifié.
# print(np.sum(a, axis=2)) # AxisError: axis 2 is out of bounds for array of dimension 2
L’exemple ci-dessus utilise 𝐧𝐩.𝐬𝐮𝐦() , mais la même chose a choisi s’applique à 𝐧𝐩.𝐦𝐞𝐚𝐧() , 𝐧𝐩.𝐦𝐚𝐱() , 𝐧𝐩.𝐦𝐢𝐧() , et ainsi de suite.
𝐚𝐱𝐢𝐬=-1 représente le dernier axe
Vous pouvez utiliser des valeurs négatives pour le paramètre 𝐚𝐱𝐢𝐬 , ce qui permet de préciser un axe dans l’ordre inverse du dernier. -1 représente le dernier axe.
Dans un tableau à deux dimensions, 𝐚𝐱𝐢𝐬=-1 équivaut à 𝐚𝐱𝐢𝐬=1 , et 𝐚𝐱𝐢𝐬=-2 équivaut à 𝐚𝐱𝐢𝐬=0 .
a = np.arange(12).reshape(3, 4) print(a) # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]] print(np.sum(a, axis=-1)) # [ 6 22 38] print(np.sum(a, axis=-2)) # [12 15 18 21]
Une erreur est générée si un axe en dehors des dimensions du tableau est spécifié.
# print(np.sum(a, axis=-3)) # AxisError: axis -3 is out of bounds for array of dimension 2
Signification du paramètre 𝐚𝐱𝐢𝐬
Pour les tableaux à deux dimensions, il suffit de se rappeler que 𝐚𝐱𝐢𝐬=0 fonctionne par colonne et 𝐚𝐱𝐢𝐬=1 fonctionne par ligne, mais considérerons la signification du paramètre 𝐚𝐱𝐢𝐬 de manière plus générale.
Ici, 𝐧𝐩.𝐬𝐮𝐦() est utilisé comme exemple, mais le même concept s’applique à d’autres fonctions et méthodes comme 𝐧𝐩.𝐦𝐞𝐚𝐧() .
Dans le cas d’un tableau 2D
Considérons un tableau bidimensionnel de forme (2, 3) .
a = np.arange(6).reshape(2, 3) print(a) # [[0 1 2] # [3 4 5]]
𝐧𝐩.𝐬𝐮𝐦() renvoie un tableau unidimensionnel de forme (3,) pour 𝐚𝐱𝐢𝐬=0 et (2,) pour 𝐚𝐱𝐢𝐬=1 .
print(np.sum(a, axis=0)) # [3 5 7] print(np.sum(a, axis=1)) # [ 3 12]
𝐚𝐱𝐢𝐬=0 agrégats le long du premier axe et 𝐚𝐱𝐢𝐬=1 agrégats le long de l’axe suivant, spécifiquement l’axe spécifié tout en préservant l’autre axe.
input : (2, 3) axis=0 : (_, 3) -> (3,) axis=1 : (2, _) -> (2,)
𝐧𝐩.𝐬𝐮𝐦(𝐚𝐱𝐢𝐬=0) et 𝐧𝐩.𝐬𝐮𝐦(𝐚𝐱𝐢𝐬=1) sont équivalentes aux opérations suivantes.
print(a[0, :] + a[1, :]) # [3 5 7] print(a[:, 0] + a[:, 1] + a[:, 2]) # [ 3 12]
: est utilisé pour sélectionner tous les éléments le long d’un axe donné. Le : de fin peut être omis, mais est inclus ici pour plus de clarté dans l’exemple ci-dessus.
Dans le cas d’un tableau 3D
Il en va de même pour les tableaux tridimensionnels et multidimensionnels supérieurs. Considérons un tableau tridimensionnel de forme (2, 3, 4) .
a = np.stack([np.ones((3, 4), int), np.full((3, 4), 10)]) print(a) # [[[ 1 1 1 1] # [ 1 1 1 1] # [ 1 1 1 1]] # # [[10 10 10 10] # [10 10 10 10] # [10 10 10 10]]] print(a.shape) # (2, 3, 4)
𝐧𝐩.𝐬𝐮𝐦() renvoie un tableau bidimensionnel de forme (3, 4) pour 𝐚𝐱𝐢𝐬=0 , (2, 4) pour 𝐚𝐱𝐢𝐬=1 et (2, 3) pour 𝐚𝐱𝐢𝐬=2 .
print(np.sum(a, axis=0)) # [[11 11 11 11] # [11 11 11 11] # [11 11 11 11]] print(np.sum(a, axis=1)) # [[ 3 3 3 3] # [30 30 30 30]] print(np.sum(a, axis=2)) # [[ 4 4 4] # [40 40 40]]
Cette opération agrège le tableau d’entrée le long de l’axe spécifié par 𝐚𝐱𝐢𝐬 , prioritairement l’axe spécifié tout en préservant les autres axes.
input : (2, 3, 4) axis=0 : (_, 3, 4) -> (3, 4) axis=1 : (2, _, 4) -> (2, 4) axis=2 : (2, 3, _) -> (2, 3)
𝐧𝐩.𝐬𝐮𝐦(𝐚𝐱𝐢𝐬=0) , 𝐧𝐩.𝐬𝐮𝐦(𝐚𝐱𝐢𝐬=1) et 𝐧𝐩.𝐬𝐮𝐦(𝐚𝐱𝐢𝐬=2) sont équivalentes aux opérations suivantes.
print(a[0, :, :] + a[1, :, :]) # [[11 11 11 11] # [11 11 11 11] # [11 11 11 11]] print(a[:, 0, :] + a[:, 1, :] + a[:, 2, :]) # [[ 3 3 3 3] # [30 30 30 30]] print(a[:, :, 0] + a[:, :, 1] + a[:, :, 2] + a[:, :, 3]) # [[ 4 4 4] # [40 40 40]]
Lorsqu’il s’agit de tableaux tridimensionnels ou multidimensionnels supérieurs, il peut être plus utile de réfléchir aux axes à conserver dans la forme, plutôt que de penser en termes de lignes, de colonnes, de profondeur, etc.
Lors de la spécification de plusieurs valeurs pour 𝐚𝐱𝐢𝐬
Vous pouvez définir plusieurs valeurs pour le paramètre 𝐚𝐱𝐢𝐬 avec un tuple. Le même concept s’applique également ici.
a = np.stack([np.ones((3, 4), int), np.full((3, 4), 10)]) print(a) # [[[ 1 1 1 1] # [ 1 1 1 1] # [ 1 1 1 1]] # # [[10 10 10 10] # [10 10 10 10] # [10 10 10 10]]] print(a.shape) # (2, 3, 4) print(np.sum(a, axis=(0, 1))) # [33 33 33 33] print(np.sum(a, axis=(0, 2))) # [44 44 44] print(np.sum(a, axis=(1, 2))) # [ 12 120]
La relation entre les formes des tableaux d’entrée et de sortie peut être considérée comme suit :
input : (2, 3, 4) axis=(0, 1) : (_, _, 4) -> (4,) axis=(0, 2) : (_, 3, _) -> (3,) axis=(1, 2) : (2, _, _) -> (2,)
Chacune est équivalente aux opérations suivantes.
print( a[0, 0, :] + a[0, 1, :] + a[0, 2, :] + a[1, 0, :] + a[1, 1, :] + a[1, 2, :] ) # [33 33 33 33] print( a[0, :, 0] + a[0, :, 1] + a[0, :, 2] + a[0, :, 3] + a[1, :, 0] + a[1, :, 1] + a[1, :, 2] + a[1, :, 3] ) # [44 44 44] print( a[:, 0, 0] + a[:, 0, 1] + a[:, 0, 2] + a[:, 0, 3] + a[:, 1, 0] + a[:, 1, 1] + a[:, 1, 2] + a[:, 1, 3] + a[:, 2, 0] + a[:, 2, 1] + a[:, 2, 2] + a[:, 2, 3] ) # [ 12 120]
𝐤𝐞𝐞𝐩𝐝𝐢𝐦𝐬 conserve les dimensions du tableau de sortie
Les fonctions et méthodes avec le paramètre 𝐚𝐱𝐢𝐬 prennent également en charge le paramètre 𝐤𝐞𝐞𝐩𝐝𝐢𝐦𝐬 . 𝐤𝐞𝐞𝐩𝐝𝐢𝐦𝐬=T𝐫𝐮𝐞 conserve le même nombre de dimensions dans le tableau de sortie que dans le tableau d’entrée.
𝐧𝐩.𝐬𝐮𝐦() est utilisé comme exemple, mais la même chose a choisi s’applique à d’autres fonctions et méthodes comme 𝐧𝐩.𝐦𝐞𝐚𝐧() .
La sortie par défaut pour un tableau d’entrée bidimensionnel est unidimensionnelle, mais 𝐤𝐞𝐞𝐩𝐝𝐢𝐦𝐬=T𝐫𝐮𝐞 renvoie un tableau bidimensionnel.
a = np.ones((3, 4), int) print(a) # [[1 1 1 1] # [1 1 1 1] # [1 1 1 1]] print(a.shape) # (3, 4) print(np.sum(a, axis=1)) # [4 4 4] print(np.sum(a, axis=1).shape) # (3,) print(np.sum(a, axis=1, keepdims=True)) # [[4] # [4] # [4]] print(np.sum(a, axis=1, keepdims=True).shape) # (3, 1)
Avec 𝐤𝐞𝐞𝐩𝐝𝐢𝐦𝐬=T𝐫𝐮𝐞 , le tableau de sortie est correctement diffusé avec le tableau d’entrée.
Dans NumPy, lors des opérations binaires, les formes des tableaux sont automatiquement alignées par diffusion lorsque cela est possible.
Dans les opérations impliquant le tableau de sortie et le tableau d’entrée (ou tout tableau ayant la même forme que l’entrée), l’utilisation de 𝐚𝐱𝐢𝐬=1 avec le paramètre par défaut peut entraîner une erreur. Cependant, 𝐤𝐞𝐞𝐩𝐝𝐢𝐦𝐬=T𝐫𝐮𝐞 garantit une diffusion correcte.
# print(a + np.sum(a, axis=1)) # ValueError: operands could not be broadcast together with shapes (3,4) (3,) print(a + np.sum(a, axis=1, keepdims=True)) # [[5 5 5 5] # [5 5 5 5] # [5 5 5 5]]
Pour 𝐚𝐱𝐢𝐬=0 , le paramètre par défaut diffuse également correctement, mais 𝐤𝐞𝐞𝐩𝐝𝐢𝐦𝐬=T𝐫𝐮𝐞 est également acceptable.
print(a + np.sum(a, axis=0)) # [[4 4 4 4] # [4 4 4 4] # [4 4 4 4]] print(a + np.sum(a, axis=0, keepdims=True)) # [[4 4 4 4] # [4 4 4 4] # [4 4 4 4]]
Pour les opérations impliquant la diffusion vers le tableau d’entrée, il peut être plus sûr de définir 𝐤𝐞𝐞𝐩𝐝𝐢𝐦𝐬=T𝐫𝐮𝐞 pour éviter les erreurs.
Il en va de même pour les tableaux tridimensionnels et multidimensionnels supérieurs. Quelle que soit la valeur spécifiée pour 𝐚𝐱𝐢𝐬 , 𝐤𝐞𝐞𝐩𝐝𝐢𝐦𝐬=T𝐫𝐮𝐞 garantit que le tableau de sortie est correctement diffusé avec le tableau d’entrée.
a = np.ones((2, 3, 4), int) print(a) # [[[1 1 1 1] # [1 1 1 1] # [1 1 1 1]] # # [[1 1 1 1] # [1 1 1 1] # [1 1 1 1]]] print(np.sum(a, axis=(0, 2))) # [8 8 8] print(np.sum(a, axis=(0, 2), keepdims=True)) # [[[8] # [8] # [8]]] # print(a + np.sum(a, axis=(0, 2))) # ValueError: operands could not be broadcast together with shapes (2,3,4) (3,) print(a + np.sum(a, axis=(0, 2), keepdims=True)) # [[[9 9 9 9] # [9 9 9 9] # [9 9 9 9]] # # [[9 9 9 9] # [9 9 9 9] # [9 9 9 9]]]