Was bedeutet -1 in der Numpy-Umformung?


419

Eine Numpy-Matrix kann mithilfe der Umformungsfunktion mit Parameter -1 in einen Vektor umgeformt werden. Aber ich weiß nicht, was -1 hier bedeutet.

Zum Beispiel:

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

Das Ergebnis von bist:matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

Weiß jemand, was -1 hier bedeutet? Und es scheint, dass Python -1 mehrere Bedeutungen zuweist, wie zum Beispiel: array[-1]bedeutet das letzte Element. Können Sie eine Erklärung geben?

Antworten:


565

Das Kriterium für die Bereitstellung der neuen Form lautet: "Die neue Form sollte mit der ursprünglichen Form kompatibel sein."

Mit numpy können wir einen der neuen Formparameter als -1 angeben (z. B. (2, -1) oder (-1,3), aber nicht (-1, -1)). Es bedeutet einfach, dass es eine unbekannte Dimension ist und wir möchten, dass Numpy es herausfindet. Und numpy wird dies herausfinden, indem es die 'Länge des Arrays und die verbleibenden Dimensionen' betrachtet und sicherstellt, dass es die oben genannten Kriterien erfüllt

Nun sehen Sie sich das Beispiel an.

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

Versuchen Sie nun, mit (-1) umzuformen. Ergebnis neue Form ist (12,) und ist kompatibel mit ursprünglicher Form (3,4)

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

Versuchen Sie nun, sich mit (-1, 1) neu zu formen. Wir haben Spalte als 1, aber Zeilen als unbekannt angegeben. So erhalten wir eine neue Form als (12, 1) .wieder kompatibel mit der ursprünglichen Form (3,4)

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

Das Obige steht im Einklang mit numpyRatschlägen / Fehlermeldungen, die reshape(-1,1)für eine einzelne Funktion verwendet werden sollen. dh einzelne Spalte

Ändern Sie Ihre Daten mithilfe von, array.reshape(-1, 1)wenn Ihre Daten nur über eine einzige Funktion verfügen

Neue Form als (-1, 2). Zeile unbekannt, Spalte 2. Wir erhalten Ergebnis neue Form als (6, 2)

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

Versuchen Sie nun, die Spalte als unbekannt zu halten. Neue Form als (1, -1). dh Zeile ist 1, Spalte unbekannt. wir erhalten Ergebnis neue Form als (1, 12)

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

Das Obige steht im Einklang mit numpyRatschlägen / Fehlermeldungen, die reshape(1,-1)für eine einzelne Stichprobe verwendet werden sollen. dh einzelne Reihe

Formen Sie Ihre Daten neu, indem Sie array.reshape(1, -1)sie verwenden, wenn sie ein einzelnes Beispiel enthalten

Neue Form (2, -1). Zeile 2, Spalte unbekannt. wir erhalten Ergebnis neue Form als (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. wir erhalten Ergebnis neue Form als (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 bereitzustellen, dh eine neue Form wie (-1, -1). Es wird ein Fehler ausgegeben

z.reshape(-1, -1)
ValueError: can only specify one unknown dimension

9
Diese Antwort enthält viele Beispiele, legt jedoch nicht dar, was -1 im Klartext tut. Beim Umformen eines Arrays muss die neue Form die gleiche Anzahl von Elementen enthalten wie die alte Form. Dies bedeutet, dass die Produkte der Abmessungen der beiden Formen gleich sein müssen. Bei Verwendung von -1 ist die dem -1 entsprechende Dimension das Produkt der Dimensionen des ursprünglichen Arrays geteilt durch das Produkt der angegebenen Dimensionen reshape, um die gleiche Anzahl von Elementen beizubehalten.
BallpointBen

1
Meiner Meinung nach sind sowohl die akzeptierte Antwort als auch diese Antwort hilfreich, während die akzeptierte Antwort einfacher ist. Ich bevorzuge die einfachere Antwort
Cloudscomputes

1
Wie ist die Form (12, 1) mit der Form (3,4) "kompatibel"?
Vijender

1
@Vijender Ich denke, es bedeutet die gleiche Anzahl von Elementen, aber unterschiedliche Achsen - dh 12x1 == 3x4?
David Waterworth

80

Wird zum Umformen eines Arrays verwendet.

Angenommen, wir haben eine dreidimensionale Anordnung von Dimensionen 2 x 10 x 10:

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

Jetzt wollen wir uns auf 5 x 5 x 8 umformen:

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

wird den Job machen.

Beachten Sie, dass Sie nach dem Festlegen des ersten Dim = 5 und des zweiten Dim = 5 die dritte Dimension nicht mehr bestimmen müssen. Um Ihre Faulheit zu unterstützen, bietet Python die Option -1:

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

gibt Ihnen ein Array von Form = (5, 5, 8).

Gleichfalls,

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

gibt Ihnen eine Reihe von Formen = (50, 4)

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


59

Nach the documentation:

newshape: int oder tuple von ints

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


In diesem Fall wird der Wert als [1, 8] abgeleitet. Und 8 ist die Gesamtzahl der Matrix a. Recht?
user2262504

@ user2262504, ich bin nicht sicher. Ich denke, der abgeleitete Wert ist, [8]weil die Dokumentation dies sagt ( 1-D array). Versuchen Sie es numpy.reshape(a, [8]). Es ergibt das gleiche Ergebnis mit numpy.reshape(a, [1,8])für die Matrix.
Falsetru

3
Mit -1 kann numpy für Sie die unbekannte Anzahl von Spalten oder Zeilen in der resultierenden Matrix bestimmen. Hinweis: Das Unbekannte sollte entweder Spalten oder Zeilen sein, nicht beide.
Gathide

15

numpy.reshape (a, newshape, order {}) Weitere Informationen finden Sie unter dem folgenden Link. https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

Für das folgende Beispiel, das Sie erwähnt haben, erklärt die Ausgabe, dass der resultierende Vektor eine einzelne Zeile ist. (- 1) gibt die Anzahl der Zeilen an, die 1 sein sollen

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

Ausgabe:

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

Dies kann mit einem anderen Beispiel genauer erklärt werden:

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

Ausgabe: (ist ein eindimensionales Spaltenarray)

Array ([[0],

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

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

Ausgabe: (ist ein eindimensionales Zeilenarray)

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


12

Es ist ziemlich leicht zu verstehen. Das "-1" steht für "unbekannte Dimension", die aus einer anderen Dimension abgeleitet werden sollte. In diesem Fall, wenn Sie Ihre Matrix wie folgt einstellen:

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

Ändern Sie Ihre Matrix wie folgt:

b = numpy.reshape(a, -1)

Es werden einige taube Operationen an die Matrix a aufgerufen, die ein 1-d-Numpy-Array / Martrix zurückgibt.

Ich halte es jedoch nicht für eine gute Idee, solchen Code zu verwenden. Warum nicht versuchen:

b = a.reshape(1,-1)

Sie erhalten das gleiche Ergebnis und es ist für die Leser klarer zu verstehen: Setzen Sie b als eine andere Form von a. Für a wissen wir nicht, wie viele Spalten es haben soll (setzen Sie es auf -1!), Aber wir wollen ein 1-dimensionales Array (setzen Sie den ersten Parameter auf 1!).


9

Lange Rede, kurzer Sinn: Sie legen einige Dimensionen fest und lassen NumPy die verbleibenden Dimensionen festlegen.

(userDim1, userDim2, ..., -1) -->>

(userDim1, userDim1, ..., TOTAL_DIMENSION - (userDim1 + userDim2 + ...))

Dies ist die Antwort auf Englisch, nach der ich gesucht habe, schlicht und einfach. dh Sie geben Ihre Design-Präferenz, lassen Sie numpy die verbleibende Mathematik ausarbeiten :)
Sumanth Lazarus

6

Es bedeutet einfach, dass Sie nicht sicher sind, wie viele Zeilen oder Spalten Sie angeben können, und dass Sie numpy bitten, die Anzahl der Spalten oder Zeilen vorzuschlagen, in die umgeformt werden soll.

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

Überprüfen Sie 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("Without reshaping  -> ")
print(a)
b = numpy.reshape(a, -1)
print("HERE We don't know about what number we should give to row/col")
print("Reshaping as (a,-1)")
print(b)
c = numpy.reshape(a, (-1,2))
print("HERE We just know about number of columns")
print("Reshaping as (a,(-1,2))")
print(c)
d = numpy.reshape(a, (2,-1))
print("HERE We just know about number of rows")
print("Reshaping as (a,(2,-1))")
print(d)

AUSGABE :-

Without reshaping  -> 
[[1 2 3 4]
 [5 6 7 8]]
HERE We don't know about what number we should give to row/col
Reshaping as (a,-1)
[[1 2 3 4 5 6 7 8]]
HERE We just know about number of columns
Reshaping as (a,(-1,2))
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
HERE We just know about number of rows
Reshaping as (a,(2,-1))
[[1 2 3 4]
 [5 6 7 8]]

2
import numpy as np
x = np.array([[2,3,4], [5,6,7]]) 

# Convert any shape to 1D shape
x = np.reshape(x, (-1)) # Making it 1 row -> (6,)

# When you don't care about rows and just want to fix number of columns
x = np.reshape(x, (-1, 1)) # Making it 1 column -> (6, 1)
x = np.reshape(x, (-1, 2)) # Making it 2 column -> (3, 2)
x = np.reshape(x, (-1, 3)) # Making it 3 column -> (2, 3)

# When you don't care about columns and just want to fix number of rows
x = np.reshape(x, (1, -1)) # Making it 1 row -> (1, 6)
x = np.reshape(x, (2, -1)) # Making it 2 row -> (2, 3)
x = np.reshape(x, (3, -1)) # Making it 3 row -> (3, 2)

0

Das Endergebnis der Konvertierung ist, dass die Anzahl der Elemente im endgültigen Array mit der des ursprünglichen Arrays oder Datenrahmens übereinstimmt.

-1 entspricht der unbekannten Anzahl der Zeilen oder Spalten. wir können es uns als x(unbekannt) vorstellen. xwird erhalten, indem die Anzahl der Elemente im ursprünglichen Array durch den anderen Wert des geordneten Paares mit -1 geteilt wird.

Beispiele

12 Elemente mit Umformung (-1,1) entsprechen einem Array mit x= 12/1 = 12 Zeilen und 1 Spalte.


12 Elemente mit Umformung (1, -1) entsprechen einem Array mit 1 Zeile und x= 12/1 = 12 Spalten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.