In poche parole, numpy.newaxis
viene utilizzato per aumentare la dimensione dell'array esistente di un'altra dimensione , se utilizzato una volta . Così,
L' array 1D diventerà un array 2D
L' array 2D diventerà array 3D
L' array 3D diventerà un array 4D
L' array 4D diventerà un array 5D
e così via..
Ecco un'illustrazione visiva che descrive la promozione dell'array 1D in array 2D.
Scenario 1 : np.newaxis
potrebbe tornare utile quando si desidera convertire esplicitamente un array 1D in un vettore di riga o in un vettore di colonna , come illustrato nella figura sopra.
Esempio:
# 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)
Scenario 2 : quando vogliamo utilizzare la trasmissione numpy come parte di alcune operazioni, ad esempio mentre facciamo l' aggiunta di alcune matrici.
Esempio:
Supponiamo che tu voglia aggiungere i seguenti due array:
x1 = np.array([1, 2, 3, 4, 5])
x2 = np.array([5, 4, 3])
Se provi ad aggiungerli in questo modo, NumPy genererà quanto segue ValueError
:
ValueError: operands could not be broadcast together with shapes (5,) (3,)
In questa situazione, è possibile utilizzare np.newaxis
per aumentare la dimensione di uno degli array in modo che NumPy possa trasmettere .
In [2]: x1_new = x1[:, np.newaxis] # x1[:, None]
# now, the shape of x1_new is (5, 1)
# array([[1],
# [2],
# [3],
# [4],
# [5]])
Ora aggiungi:
In [3]: x1_new + x2
Out[3]:
array([[ 6, 5, 4],
[ 7, 6, 5],
[ 8, 7, 6],
[ 9, 8, 7],
[10, 9, 8]])
In alternativa, puoi anche aggiungere un nuovo asse all'array x2
:
In [6]: x2_new = x2[:, np.newaxis] # x2[:, None]
In [7]: x2_new # shape is (3, 1)
Out[7]:
array([[5],
[4],
[3]])
Ora aggiungi:
In [8]: x1 + x2_new
Out[8]:
array([[ 6, 7, 8, 9, 10],
[ 5, 6, 7, 8, 9],
[ 4, 5, 6, 7, 8]])
Nota : osserva che otteniamo lo stesso risultato in entrambi i casi (ma uno è il recepimento dell'altro).
Scenario 3 : è simile allo scenario 1. Tuttavia, è possibile utilizzare np.newaxis
più di una volta per promuovere l'array a dimensioni superiori. Tale operazione è talvolta necessaria per array di ordine superiore ( cioè tensori ).
Esempio:
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)
Ulteriori informazioni su np.newaxis vs np.reshape
newaxis
viene anche chiamato come pseudo-indice che consente l'aggiunta temporanea di un asse in un multiarray.
np.newaxis
utilizza l'operatore affettatura di ricreare la matrice mentre np.reshape
rimodella la matrice al layout desiderato (supponendo che le dimensioni corrispondono, e questo è mosto per un reshape
accada).
Esempio
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)
Nell'esempio sopra, abbiamo inserito un asse temporaneo tra il primo e il secondo asse di B
(per usare la trasmissione). Un asse mancante viene compilato qui usando np.newaxis
per far funzionare l' operazione di trasmissione .
Suggerimento generale : puoi anche usareNone
al posto dinp.newaxis
; Questi sono in effetti gli stessi oggetti .
In [13]: np.newaxis is None
Out[13]: True
PS Vedi anche questa grande risposta: newaxis vs reshape per aggiungere dimensioni
except that it changes a row vector to a column vector?
Il primo esempio non è un vettore di riga. Questo è un concetto matlab. In Python è solo un vettore monodimensionale senza concetto di riga o colonna. I vettori di riga o colonna sono bidimensionali, come il secondo esempio