Wie funktioniert numpy.newaxis und wann wird es verwendet?

184

Wenn ich es versuche

numpy.newaxis

Das Ergebnis ergibt einen 2D-Plotrahmen mit einer x-Achse von 0 bis 1. Wenn ich jedoch versuche numpy.newaxis, einen Vektor zu schneiden,

vector[0:4,]
[ 0.04965172  0.04979645  0.04994022  0.05008303]
vector[:, np.newaxis][0:4,]
[[ 0.04965172]
[ 0.04979645]
[ 0.04994022]
[ 0.05008303]]

Ist es dasselbe, außer dass es einen Zeilenvektor in einen Spaltenvektor ändert?

Was numpy.newaxisnützt es im Allgemeinen und unter welchen Umständen sollten wir es verwenden?

Yue Harriet Huang
quelle
1
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
Endolith

Antworten:

323

Einfach gesagt, numpy.newaxiswird 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.

Newaxis Canva Visualisierung


Szenario 1 : np.newaxisDies 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.newaxisdie 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.newaxismehrmals 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.newaxisverwendet den Slicing Bediener das Array , während neu np.reshapeformt die Anordnung zu dem gewünschten Layout (unter der Annahme , dass die Abmessungen entsprechen, und dies ist Muss für eine reshapegeschehen).

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 auchNoneanstelle 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

kmario23
quelle
3
Welche Art von Operation ist x1_new + x2? Es ist komisch für mich, weil ich dachte, dass zwei Matrizen nur hinzugefügt werden können, wenn sie die gleichen Dimensionen haben (oder wenn eine von ihnen tatsächlich nur ein Skalar ist).
Stephen
2
@ Stephen Wie ich auch in der Antwort bemerkt habe, liegt es an NumPy Broadcasting.
kmario23
2
Dies ist eine großartige
Erklärung
2
@valdrinit froh, dass es für Sie hilfreich ist :)
kmario23
1
@ kmario23 In der Tat ist die Zuschreibung im allerletzten Satz des Artikels versteckt, kein Wunder, dass ich sie nicht gesehen habe. Ich halte es trotz dieser Zuschreibung für grenzwertiges Plagiat. In meinem Buch ist das Kopieren von Wörtern nur dann akzeptabel, wenn derselbe Autor auf verschiedenen Plattformen veröffentlicht. Ich habe besser von Medium erwartet.
Chiraz BenAbdelkader vor
29

Was ist np.newaxis ?

Dies np.newaxisist nur ein Alias ​​für die Python-Konstante None. Dies bedeutet, dass Sie überall dort, wo Sie verwenden np.newaxis, auch Folgendes verwenden können None:

>>> np.newaxis is None
True

Es ist nur aussagekräftiger, wenn Sie Code lesen, der np.newaxisanstelle von verwendet wirdNone .

Wie benutzt man np.newaxis ?

Das np.newaxiswird in der Regel beim Schneiden verwendet. Es zeigt an, dass Sie dem Array eine zusätzliche Dimension hinzufügen möchten. Die Position von np.newaxisstellt dar, wo ich Dimensionen hinzufügen möchte.

>>> import numpy as np
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a.shape
(10,)

Im ersten Beispiel verwende ich alle Elemente aus der ersten Dimension und füge eine zweite Dimension hinzu:

>>> a[:, np.newaxis]
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])
>>> a[:, np.newaxis].shape
(10, 1)

Im zweiten Beispiel wird eine Dimension als erste Dimension hinzugefügt und anschließend werden alle Elemente aus der ersten Dimension des ursprünglichen Arrays als Elemente in der zweiten Dimension des Ergebnisarrays verwendet:

>>> a[np.newaxis, :]  # The output has 2 [] pairs!
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
>>> a[np.newaxis, :].shape
(1, 10)

Ebenso können Sie mehrere verwenden np.newaxis, um mehrere Dimensionen hinzuzufügen:

>>> a[np.newaxis, :, np.newaxis]  # note the 3 [] pairs in the output
array([[[0],
        [1],
        [2],
        [3],
        [4],
        [5],
        [6],
        [7],
        [8],
        [9]]])
>>> a[np.newaxis, :, np.newaxis].shape
(1, 10, 1)

Gibt es Alternativen zu np.newaxis ?

Es gibt eine weitere sehr ähnliche Funktion in NumPy:, np.expand_dimsmit der auch eine Dimension eingefügt werden kann:

>>> np.expand_dims(a, 1)  # like a[:, np.newaxis]
>>> np.expand_dims(a, 0)  # like a[np.newaxis, :]

Da es jedoch nur 1s in das Array einfügt, können shapeSie auch reshapedas Array hinzufügen, um diese Dimensionen hinzuzufügen:

>>> a.reshape(a.shape + (1,))  # like a[:, np.newaxis]
>>> a.reshape((1,) + a.shape)  # like a[np.newaxis, :]

In den meisten Fällen np.newaxisist es am einfachsten, Dimensionen hinzuzufügen, aber es ist gut, die Alternativen zu kennen.

Wann verwenden np.newaxis?

In mehreren Kontexten ist das Hinzufügen von Dimensionen nützlich:

  • Wenn die Daten eine bestimmte Anzahl von Dimensionen haben sollen. Zum Beispiel, wenn Sie matplotlib.pyplot.imshowein 1D-Array anzeigen möchten .

  • Wenn Sie möchten, dass NumPy Arrays sendet. Durch Hinzufügen einer Dimension können Sie beispielsweise den Unterschied zwischen allen Elementen eines Arrays ermitteln : a - a[:, np.newaxis]. Dies funktioniert, weil NumPy-Vorgänge ab der letzten Dimension 1 gesendet werden .

  • Hinzufügen einer erforderlichen Dimension, damit NumPy Arrays senden kann . Dies funktioniert, weil jede Dimension der Länge 1 einfach an die Länge der entsprechenden Dimension 1 des anderen Arrays gesendet wird .


1 Wenn Sie mehr über die Übertragungsregeln erfahren möchten, ist die NumPy-Dokumentation zu diesem Thema sehr gut. Es enthält auch ein Beispiel mit np.newaxis:

>>> a = np.array([0.0, 10.0, 20.0, 30.0])
>>> b = np.array([1.0, 2.0, 3.0])
>>> a[:, np.newaxis] + b
array([[  1.,   2.,   3.],
       [ 11.,  12.,  13.],
       [ 21.,  22.,  23.],
       [ 31.,  32.,  33.]])
MSeifert
quelle
Ich sehe keinen Unterschied zwischen dem 2. und 3. Anwendungsfall. Bei beiden geht es darum, NumPy zu erlauben, ein Array als Teil einer Operation zu senden. Wenn nicht, wäre es hilfreich, ein Beispiel für den dritten Anwendungsfall hinzuzufügen, um den Punkt zu verdeutlichen.
Chiraz BenAbdelkader vor
@ChirazBenAbdelkader Ja, die Unterscheidung ist nicht wirklich so deutlich. Ich bin mir nicht sicher, ob ich den dritten Punkt entfernen oder mit dem zweiten zusammenführen soll.
MSeifert vor
9

Sie haben mit einer eindimensionalen Liste von Zahlen begonnen. Sobald Sie verwendet habennumpy.newaxis haben Sie daraus eine zweidimensionale Matrix gemacht, die aus vier Zeilen mit jeweils einer Spalte besteht.

Sie können diese Matrix dann für die Matrixmultiplikation verwenden oder sie in die Konstruktion einer größeren 4 xn-Matrix einbeziehen.

Kevin
quelle
5

newaxisDas Objekt im Auswahltupel dient dazu , die Abmessungen der resultierenden Auswahl um eine Einheitslängenabmessung zu erweitern .

Es ist nicht nur die Umwandlung der Zeilenmatrix in die Spaltenmatrix.

Betrachten Sie das folgende Beispiel:

In [1]:x1 = np.arange(1,10).reshape(3,3)
       print(x1)
Out[1]: array([[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]])

Fügen wir nun unseren Daten eine neue Dimension hinzu:

In [2]:x1_new = x1[:,np.newaxis]
       print(x1_new)
Out[2]:array([[[1, 2, 3]],

              [[4, 5, 6]],

              [[7, 8, 9]]])

Sie können sehen, dass newaxis die zusätzliche Dimension hier hinzugefügt wurde, x1 hatte Dimension (3,3) und X1_neu hat Dimension (3,1,3).

Wie unsere neue Dimension es uns ermöglicht, verschiedene Operationen durchzuführen:

In [3]:x2 = np.arange(11,20).reshape(3,3)
       print(x2)
Out[3]:array([[11, 12, 13],
              [14, 15, 16],
              [17, 18, 19]]) 

Wenn wir x1_new und x2 addieren, erhalten wir:

In [4]:x1_new+x2
Out[4]:array([[[12, 14, 16],
               [15, 17, 19],
               [18, 20, 22]],

              [[15, 17, 19],
               [18, 20, 22],
               [21, 23, 25]],

              [[18, 20, 22],
               [21, 23, 25],
               [24, 26, 28]]])

Somit newaxisist nicht nur die Umwandlung von Zeile in Spaltenmatrix. Es vergrößert die Dimension der Matrix und ermöglicht es uns, mehr Operationen daran durchzuführen.

harte Hundiwala
quelle
1
Es ist nicht nur eine Matrix, es funktioniert mit jeder ndarrayNumPy-Terminologie.
kmario23