Numpy Umformen von 1d zu 2d-array mit 1 Spalte
In numpy
die Abmessungen des resultierenden Arrays variieren zur Laufzeit.
Oft gibt es Verwirrung zwischen einem 1d-Arrays und 2d-Arrays mit 1 Spalte.
In einem Fall, den ich kann die Iteration über die Spalten, in dem anderen Fall kann ich nicht.
Wie lösen Sie elegant das problem?
Um zu vermeiden, littering mein code mit if
Anweisungen überprüfung der Dimensionalität, verwende ich diese Funktion:
def reshape_to_vect(ar):
if len(ar.shape) == 1:
return ar.reshape(ar.shape[0],1)
return ar
Jedoch, das fühlt sich unelegant und teuer. Gibt es eine bessere Lösung?
- Was ist die
dtype
? Siehtstructured
. - Es ist irrelevant, ich habe gerade verwendet, die, wie ein Beispiel ich könnte am Ende mit 1d-oder 2d-array. Meine Frage ist, wie konvertiert aus 1d auf 2d-array systematisch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einfachste Weg:
Könnten Sie tun -
Zweiten Eingang zu
reshape
:-1
kümmert sich um die Anzahl der Elemente für die zweite Achse. So, für2D
input Fall ist, braucht es keine änderung. Für eine1D
- input-Fall, es schafft eine2D
array mit allen Elementen zu "schob" auf der ersten Achse wegenar.shape[0]
, das war die totale Anzahl der Elemente.Probe läuft
1D-Fall :
2D-Fall :
x = np.reshape(x, (len(x),-1))
, die befasst sich auch mit dem Fall, wenn die Eingabe ein 1d-oder 2d-Liste.Einer Variante der Antwort von divakar ist:
x = np.reshape(x, (len(x),-1))
, die befasst sich auch mit dem Fall, wenn die Eingabe ein 1d-oder 2d-Liste.Fragte ich
dtype
weil Ihr Beispiel ist rätselhaft.Kann ich ein strukturiertes array mit 3 Elementen (1d) und 3-Felder:
Kann ich den Zugriff auf ein Feld mit Namen (hinzufügen von Klammern ändert sich nicht, Dinge)
aber wenn ich access 2 Felder, ich bekomme immer noch ein 1d-array
Eigentlich diese zusätzlichen Klammern nicht egal, wenn ich sehe, Werte
Wenn das array ist eine einfache 2d -, habe ich noch nicht bekommen, Ihre Formen
Aber wie in der Frage der Herstellung sicher, dass ein 2d-array ist, unabhängig davon, ob die Indizierung gibt 1d oder 2, Ihre Funktion ist im Grunde ok
Könnte man testen
ar.ndim
stattlen(ar.shape)
. Aber so oder so es ist nicht teuer - das heißt, die Ausführungszeit minimal ist - das ist kein großes array-Operationen.reshape
kopiert nicht die Daten (es sei denn, Ihre Fortschritte sind seltsam), so ist es gerade die Kosten für das erstellen eines neuen array-Objekts mit einer gemeinsamen Daten-Zeiger.Blick auf den code für
np.atleast_2d
; es tests für 0d und 1d. Im 1d-Fall gibt esresult = ary[newaxis,:]
. Es fügt die zusätzliche Achse, die erste, die mehr Natürlichenumpy
Standort für das hinzufügen einer Achse. Fügen Sie es am Ende.ar.reshape(ar.shape[0],-1)
ist ein cleverer Weg, unter Umgehung derif
test. In kleinen timing-tests schneller, aber wir reden hier von Mikrosekunden, die Wirkung einer function-call-Ebene.np.column_stack
ist eine weitere Funktion, die erstellt Spalte arrays, wenn nötig. Es verwendet:Zu vermeiden, die Notwendigkeit der Umgestaltung in der ersten Ort, wenn Sie schneiden eine Zeile /Spalte mit einer Liste, oder eine "laufende" Scheibe, bekommst du ein 2D-array mit einer Zeile /Spalte
Statt, wenn Sie eine einzelne Zahl für die Auswahl der Zeile/Spalte, es wird Ergebnis in einem 1D-array, die die Ursache für Ihr Problem ist: