web-dev-qa-db-fra.com

Comment fonctionne le paramètre d'axe de NumPy?

Quelqu'un peut-il expliquer exactement ce que le paramètre axis de NumPy fait?

Je suis terriblement confus.

J'essaie d'utiliser la fonction myArray.sum(axis=num)

Au début, je pensais que si le tableau avait lui-même 3 dimensions, axis=0 renverrait trois éléments, composés de la somme de tous les éléments imbriqués se trouvant à la même position. Si chaque dimension contenait cinq dimensions, je m'attendais à ce que axis=1 renvoie un résultat de cinq éléments, etc.

Cependant, ce n'est pas le cas et la documentation ne m'aide pas beaucoup (ils utilisent un tableau 3x3x3, il est donc difficile de dire ce qui se passe)

Voici ce que j'ai fait:

>>> e
array([[[1, 0],
        [0, 0]],

       [[1, 1],
        [1, 0]],

       [[1, 0],
        [0, 1]]])
>>> e.sum(axis = 0)
array([[3, 1],
       [1, 1]])
>>> e.sum(axis=1)
array([[1, 0],
       [2, 1],
       [1, 1]])
>>> e.sum(axis=2)
array([[1, 0],
       [2, 1],
       [1, 1]])
>>>

Clairement le résultat n'est pas intuitif.

27
CodyBugstein

Clairement,

e.shape == (3, 2, 2)

La somme sur un axe est une opération de réduction, de sorte que l'axe spécifié disparaît. Par conséquent,

e.sum(axis=0).shape == (2, 2)
e.sum(axis=1).shape == (3, 2)
e.sum(axis=2).shape == (3, 2)
19
Martin

Pour comprendre intuitivement la axis, reportez-vous à l'image ci-dessous (source: Physics Dept, Cornell Uni )

 enter image description here

Le forme du tableau (booléen) dans la figure ci-dessus est shape=(8, 3). ndarray.shape renverra un Tuple où les entrées correspondent à la longueur de la dimension particulière. Dans notre exemple, 8 correspond à la longueur de axis 0 alors que 3 correspond à la longueur de axis 1 .

7
kmario23

Si quelqu'un a besoin de cette description visuelle: 

 numpy axis

1
debaonline4u

Il existe de bonnes réponses pour la visualisation, mais il peut être utile de penser uniquement du point de vue analytique. 

Vous pouvez créer un tableau de dimension arbitraire avec numpy. Par exemple, voici un tableau à 5 dimensions:

>>> a = np.random.Rand(2, 3, 4, 5, 6)
>>> a.shape
(2, 3, 4, 5, 6)

Vous pouvez accéder à n'importe quel élément de ce tableau en spécifiant des index. Par exemple, voici le premier élément de ce tableau:

>>> a[0, 0, 0, 0, 0]
0.0038908603263844155

Maintenant, si vous supprimez l'une des dimensions, vous obtenez le nombre d'éléments dans cette dimension:

>>> a[0, 0, :, 0, 0]
array([0.00389086, 0.27394775, 0.26565889, 0.62125279])

Lorsque vous appliquez une fonction telle que sum avec le paramètre axis, cette dimension est éliminée et un tableau de dimension inférieur à l'original est créé. Pour chaque cellule du nouveau tableau, l'opérateur obtiendra la liste des éléments et appliquera la fonction de réduction pour obtenir un scaler.

>>> np.sum(a, axis=2).shape
(2, 3, 5, 6)

Maintenant, vous pouvez vérifier que le premier élément de ce tableau est la somme des éléments ci-dessus:

>>> np.sum(a, axis=2)[0, 0, 0, 0]
1.1647502999560164

>>> a[0, 0, :, 0, 0].sum()
1.1647502999560164

Le axis=None a une signification particulière pour aplatir le tableau et appliquer une fonction à tous les nombres.

Vous pouvez maintenant penser à des cas plus complexes où l’axe n’est pas seulement un nombre mais un tuple:

>>> np.sum(a, axis=(2,3)).shape
(2, 3, 6)

Notez que nous utilisons la même technique pour comprendre comment cette réduction a été effectuée:

>>> np.sum(a, axis=(2,3))[0,0,0]
7.889432081931909

>>> a[0, 0, :, :, 0].sum()
7.88943208193191

Vous pouvez également utiliser le même raisonnement pour ajouter dimension dans un tableau au lieu de réduire dimension:

>>> x = np.random.Rand(3, 4)
>>> y = np.random.Rand(3, 4)

# New dimension is created on specified axis
>>> np.stack([x, y], axis=2).shape
(3, 4, 2)
>>> np.stack([x, y], axis=0).shape
(2, 3, 4)

# To retrieve item i in stack set i in that axis 

J'espère que cela vous donne une compréhension générique et complète de ce paramètre important.

0
Shital Shah