En termes simples, numpy.newaxis
est utilisé pour augmenter la dimension du tableau existant d' une dimension supplémentaire , lorsqu'il est utilisé une fois . Donc,
Le tableau 1D deviendra un tableau 2D
Le tableau 2D deviendra un tableau 3D
Le tableau 3D deviendra un tableau 4D
La matrice 4D deviendra une matrice 5D
etc..
Voici une illustration visuelle qui représente la promotion d'un tableau 1D vers des tableaux 2D.
Scénario-1 : np.newaxis
peut être utile lorsque vous souhaitez convertir explicitement un tableau 1D en vecteur de ligne ou en vecteur de colonne , comme illustré dans l'image ci-dessus.
Exemple:
# 1D array
In [7]: arr = np.arange(4)
In [8]: arr.shape
Out[8]: (4,)
# make it as row vector by inserting an axis along first dimension
In [9]: row_vec = arr[np.newaxis, :] # arr[None, :]
In [10]: row_vec.shape
Out[10]: (1, 4)
# make it as column vector by inserting an axis along second dimension
In [11]: col_vec = arr[:, np.newaxis] # arr[:, None]
In [12]: col_vec.shape
Out[12]: (4, 1)
Scénario-2 : Lorsque nous voulons utiliser la diffusion numpy dans le cadre d'une opération, par exemple lors de l' ajout de certains tableaux.
Exemple:
Supposons que vous souhaitiez ajouter les deux tableaux suivants:
x1 = np.array([1, 2, 3, 4, 5])
x2 = np.array([5, 4, 3])
Si vous essayez de les ajouter comme ça, NumPy soulèvera les éléments suivants ValueError
:
ValueError: operands could not be broadcast together with shapes (5,) (3,)
Dans cette situation, vous pouvez utiliser np.newaxis
pour augmenter la dimension de l'un des tableaux afin que NumPy puisse diffuser .
In [2]: x1_new = x1[:, np.newaxis] # x1[:, None]
# now, the shape of x1_new is (5, 1)
# array([[1],
# [2],
# [3],
# [4],
# [5]])
Maintenant, ajoutez:
In [3]: x1_new + x2
Out[3]:
array([[ 6, 5, 4],
[ 7, 6, 5],
[ 8, 7, 6],
[ 9, 8, 7],
[10, 9, 8]])
Vous pouvez également ajouter un nouvel axe au tableau x2
:
In [6]: x2_new = x2[:, np.newaxis] # x2[:, None]
In [7]: x2_new # shape is (3, 1)
Out[7]:
array([[5],
[4],
[3]])
Maintenant, ajoutez:
In [8]: x1 + x2_new
Out[8]:
array([[ 6, 7, 8, 9, 10],
[ 5, 6, 7, 8, 9],
[ 4, 5, 6, 7, 8]])
Remarque : Observez que nous obtenons le même résultat dans les deux cas (mais l'un étant la transposition de l'autre).
Scénario-3 : Ceci est similaire au scénario-1. Mais vous pouvez en utiliser np.newaxis
plusieurs pour promouvoir le tableau à des dimensions plus élevées. Une telle opération est parfois nécessaire pour les tableaux d'ordre supérieur ( c'est-à-dire les tenseurs ).
Exemple:
In [124]: arr = np.arange(5*5).reshape(5,5)
In [125]: arr.shape
Out[125]: (5, 5)
# promoting 2D array to a 5D array
In [126]: arr_5D = arr[np.newaxis, ..., np.newaxis, np.newaxis] # arr[None, ..., None, None]
In [127]: arr_5D.shape
Out[127]: (1, 5, 5, 1, 1)
Plus d'informations sur np.newaxis vs np.reshape
newaxis
est également appelé pseudo-index qui permet l'ajout temporaire d'un axe dans un multiarray.
np.newaxis
utilise l'opérateur de découpage pour recréer le tableau tout en np.reshape
remodelant le tableau à la disposition souhaitée (en supposant que les dimensions correspondent; et cela est indispensable pour que reshape
cela se produise).
Exemple
In [13]: A = np.ones((3,4,5,6))
In [14]: B = np.ones((4,6))
In [15]: (A + B[:, np.newaxis, :]).shape # B[:, None, :]
Out[15]: (3, 4, 5, 6)
Dans l'exemple ci-dessus, nous avons inséré un axe temporaire entre les premier et deuxième axes de B
(pour utiliser la diffusion). Un axe manquant est rempli ici np.newaxis
pour faire fonctionner l' opération de diffusion .
Conseil général : vous pouvez également utiliserNone
à la place denp.newaxis
; Ce sont en fait les mêmes objets .
In [13]: np.newaxis is None
Out[13]: True
PS Voir également cette excellente réponse: newaxis vs remodeler pour ajouter des dimensions
except that it changes a row vector to a column vector?
Le premier exemple n'est pas un vecteur de ligne. C'est un concept matlab. En python, c'est juste un vecteur à une dimension sans concept de ligne ou de colonne. Les vecteurs de ligne ou de colonne sont à 2 dimensions, comme le deuxième exemple