664 Stimmen

Was bedeutet -1 in der numpy reshape Funktion?

Ein 2D-Array kann mit .reshape(-1) in ein 1D-Array umgeformt werden. Zum Beispiel:

>>> a = numpy.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> a.reshape(-1)
array([[1, 2, 3, 4, 5, 6, 7, 8]])

Normalerweise bedeutet array[-1] das letzte Element. Aber was bedeutet -1 hier?

868voto

Julu Ahamed Punkte 8863

Das Kriterium zur Erfüllung für die Bereitstellung der neuen Form ist, dass 'Die neue Form mit der Originalform kompatibel sein sollte'

numpy ermöglicht es uns, einen der neuen Formparameter als -1 anzugeben (z. B .: (2,-1) oder (-1,3) aber nicht (-1, -1)). Das bedeutet einfach, dass es eine unbekannte Dimension ist und wir möchten, dass numpy es herausfindet. Numpy wird dies tun, indem es sich die 'Länge des Arrays und die verbleibenden Dimensionen' ansieht und sicherstellt, dass es das oben genannte Kriterium erfüllt

Jetzt sieh dir das Beispiel an.

z = np.array([[1, 2, 3, 4],
         [5, 6, 7, 8],
         [9, 10, 11, 12]])
z.shape
(3, 4)

Versuchen wir jetzt, mit (-1) umzuformen. Das Ergebnis der neuen Form ist (12,) und ist kompatibel mit der Originalform (3,4)

z.reshape(-1)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

Versuchen wir jetzt, mit (-1, 1) umzuformen. Wir haben die Spalte als 1 angegeben, aber die Zeilen als unbekannt. Daher erhalten wir als Ergebnis der neuen Form (12, 1), wieder kompatibel mit der Originalform (3,4)

z.reshape(-1,1)
array([[ 1],
   [ 2],
   [ 3],
   [ 4],
   [ 5],
   [ 6],
   [ 7],
   [ 8],
   [ 9],
   [10],
   [11],
   [12]])

Das oben genannte ist konsistent mit numpy Rat-/Fehlermeldung, reshape(-1,1) für ein einzelnes Merkmal, also eine einzelne Spalte zu verwenden

Formen Sie Ihre Daten mit array.reshape(-1, 1) um, wenn Ihre Daten ein einzelnes Merkmal haben

Neue Form als (-1, 2). Zeile unbekannt, Spalte 2. Das Ergebnis der neuen Form ist (6, 2)

z.reshape(-1, 2)
array([[ 1,  2],
   [ 3,  4],
   [ 5,  6],
   [ 7,  8],
   [ 9, 10],
   [11, 12]])

Versuchen wir jetzt, die Spalte unbekannt zu lassen. Neue Form als (1,-1). Das bedeutet, Zeile ist 1, Spalte unbekannt. Das Ergebnis der neuen Form ist (1, 12)

z.reshape(1,-1)
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]])

Das oben genannte ist konsistent mit numpy Rat-/Fehlermeldung, reshape(1,-1) für eine einzelne Probe, also eine einzelne Zeile zu verwenden

Formen Sie Ihre Daten mit array.reshape(1, -1) um, wenn es eine einzige Probe enthält

Neue Form (2, -1). Zeile 2, Spalte unbekannt. Das Ergebnis der neuen Form ist (2,6)

z.reshape(2, -1)
array([[ 1,  2,  3,  4,  5,  6],
   [ 7,  8,  9, 10, 11, 12]])

Neue Form als (3, -1). Zeile 3, Spalte unbekannt. Das Ergebnis der neuen Form ist (3,4)

z.reshape(3, -1)
array([[ 1,  2,  3,  4],
   [ 5,  6,  7,  8],
   [ 9, 10, 11, 12]])

Und schließlich, wenn wir versuchen, beide Dimensionen als unbekannt anzugeben, also neue Form als (-1,-1). Wird ein Fehler geworfen

z.reshape(-1, -1)
ValueError: kann nur eine unbekannte Dimension angeben

113voto

Anuj Gupta Punkte 6120

Sagen wir, wir haben ein 3-dimensionales Array mit den Dimensionen 2 x 10 x 10:

r = numpy.random.rand(2, 10, 10) 

Jetzt möchten wir es umbilden zu 5 x 5 x 8:

numpy.reshape(r, shape=(5, 5, 8)) 

wird den Job erledigen.

Beachten Sie, dass, sobald Sie die erste dim = 5 und die zweite dim = 5 festlegen, Sie die dritte Dimension nicht mehr angeben müssen. Um Ihre Faulheit zu unterstützen, bietet Numpy die Option, -1 zu verwenden:

numpy.reshape(r, shape=(5, 5, -1)) 

wird Ihnen ein Array mit shape = (5, 5, 8) geben.

Ebenso,

numpy.reshape(r, shape=(50, -1)) 

wird Ihnen ein Array mit der Form = (50, 4) geben

Sie können mehr unter http://anie.me/numpy-reshape-transpose-theano-dimshuffle/ lesen

71voto

falsetru Punkte 353059

Laut Dokumentation:

newshape : int oder Tupel von ints

Die neue Form sollte mit der ursprünglichen Form kompatibel sein. Wenn ein Integerwert ist, wird das Ergebnis ein 1-D-Array dieser Länge sein. Eine Form Dimension kann -1. In diesem Fall wird der Wert aus der Länge des Array und den verbleibenden Dimensionen abgeleitet.

24voto

Dinesh Kumar Punkte 414
numpy.reshape(a, newshape, order{})

Überprüfen Sie den untenstehenden Link für weitere Informationen. https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

für das untenstehende Beispiel haben Sie den Output angegeben, der erklärt, dass der resultierende Vektor eine einzige Zeile sein soll. (-1) gibt an, dass die Anzahl der Zeilen 1 sein soll. if the

a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
b = numpy.reshape(a, -1)

Output:

matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

Dies kann mit einem weiteren Beispiel besser erklärt werden:

b = np.arange(10).reshape((-1,1))

Output:(ist ein eindimensionales Spaltenarray)

array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])

oder

b = np.arange(10).reshape((1,-1))

Output:(ist ein eindimensionales Zeilenarray)

array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])

23voto

lonewolf Punkte 309

Es bedeutet einfach, dass du nicht sicher bist, wie viele Zeilen oder Spalten du angeben kannst und du numpy bittest, die Anzahl der Spalten oder Zeilen vorzuschlagen, die umgeformt werden sollen.

numpy bietet das letzte Beispiel für -1 an https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

Überprüfe den folgenden Code und seine Ausgabe, um (-1) besser zu verstehen:

CODE:-

import numpy
a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
print("Ohne Umformung  -> ")
print(a)
b = numpy.reshape(a, -1)
print("HIER wissen wir nicht, welche Anzahl wir für Reihen/Spalten angeben sollen")
print("Umformung als (a,-1)")
print(b)
c = numpy.reshape(a, (-1,2))
print("HIER wissen wir nur über die Anzahl der Spalten Bescheid")
print("Umformung als (a,(-1,2))")
print(c)
d = numpy.reshape(a, (2,-1))
print("HIER wissen wir nur über die Anzahl der Zeilen Bescheid")
print("Umformung als (a,(2,-1))")
print(d)

AUSGABE :-

Ohne Umformung  -> 
[[1 2 3 4]
 [5 6 7 8]]
HIER wissen wir nicht, welche Anzahl wir für Reihen/Spalten angeben sollen
Umformung als (a,-1)
[[1 2 3 4 5 6 7 8]]
HIER wissen wir nur über die Anzahl der Spalten Bescheid
Umformung als (a,(-1,2))
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
HIER wissen wir nur über die Anzahl der Zeilen Bescheid
Umformung als (a,(2,-1))
[[1 2 3 4]
 [5 6 7 8]]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X