Einfach gesagt, numpy.newaxis
wird verwendet , um die Dimension zu erhöhen , indem der bestehenden Anordnung einer weiteren Dimension , wenn verwendet einmal . So,
1D- Array wird zu 2D- Array
2D- Array wird zu 3D- Array
Das 3D- Array wird zum 4D- Array
Das 4D- Array wird zum 5D- Array
und so weiter..
Hier ist eine visuelle Darstellung, die die Heraufstufung eines 1D-Arrays zu 2D-Arrays zeigt.
Szenario 1 : np.newaxis
Dies kann nützlich sein, wenn Sie ein 1D-Array explizit in einen Zeilenvektor oder einen Spaltenvektor konvertieren möchten , wie im obigen Bild dargestellt.
Beispiel:
# 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)
Szenario 2 : Wenn wir Numpy Broadcasting als Teil einer Operation verwenden möchten , beispielsweise während der Addition einiger Arrays.
Beispiel:
Angenommen, Sie möchten die folgenden zwei Arrays hinzufügen:
x1 = np.array([1, 2, 3, 4, 5])
x2 = np.array([5, 4, 3])
Wenn Sie versuchen, diese einfach so hinzuzufügen, wird NumPy Folgendes auslösen ValueError
:
ValueError: operands could not be broadcast together with shapes (5,) (3,)
In dieser Situation können Sie np.newaxis
die Dimension eines der Arrays erhöhen, damit NumPy senden kann .
In [2]: x1_new = x1[:, np.newaxis] # x1[:, None]
# now, the shape of x1_new is (5, 1)
# array([[1],
# [2],
# [3],
# [4],
# [5]])
Fügen Sie nun hinzu:
In [3]: x1_new + x2
Out[3]:
array([[ 6, 5, 4],
[ 7, 6, 5],
[ 8, 7, 6],
[ 9, 8, 7],
[10, 9, 8]])
Alternativ können Sie dem Array auch eine neue Achse hinzufügen x2
:
In [6]: x2_new = x2[:, np.newaxis] # x2[:, None]
In [7]: x2_new # shape is (3, 1)
Out[7]:
array([[5],
[4],
[3]])
Fügen Sie nun hinzu:
In [8]: x1 + x2_new
Out[8]:
array([[ 6, 7, 8, 9, 10],
[ 5, 6, 7, 8, 9],
[ 4, 5, 6, 7, 8]])
Hinweis : Beachten Sie, dass wir in beiden Fällen das gleiche Ergebnis erzielen (wobei eines die Transponierte des anderen ist).
Szenario 3 : Dies ähnelt Szenario 1. Sie können das Array jedoch np.newaxis
mehrmals verwenden, um es auf höhere Dimensionen zu bringen. Eine solche Operation wird manchmal für Arrays höherer Ordnung ( dh Tensoren ) benötigt.
Beispiel:
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)
Weitere Hintergrundinformationen zu np.newaxis vs np.reshape
newaxis
wird auch als Pseudoindex bezeichnet, der das temporäre Hinzufügen einer Achse zu einem Multiarray ermöglicht.
np.newaxis
verwendet den Slicing Bediener das Array , während neu np.reshape
formt die Anordnung zu dem gewünschten Layout (unter der Annahme , dass die Abmessungen entsprechen, und dies ist Muss für eine reshape
geschehen).
Beispiel
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)
Im obigen Beispiel haben wir eine temporäre Achse zwischen der ersten und der zweiten Achse von eingefügt B
(um Rundfunk zu verwenden). Hier wird eine fehlende Achse ausgefüllt np.newaxis
, damit der Sendevorgang funktioniert.
Allgemeiner Tipp : Sie können auchNone
anstelle von verwendennp.newaxis
; Dies sind in der Tat die gleichen Objekte .
In [13]: np.newaxis is None
Out[13]: True
PS Siehe auch diese großartige Antwort: newaxis vs reshape, um Dimensionen hinzuzufügen
except that it changes a row vector to a column vector?
Das erste Beispiel ist kein Zeilenvektor. Das ist ein Matlab-Konzept. In Python ist es nur ein eindimensionaler Vektor ohne Zeilen- oder Spaltenkonzept. Zeilen- oder Spaltenvektoren sind zweidimensional, wie im zweiten Beispiel