Angenommen, ich habe ein NumPy-Array a
:
a = np.array([
[1, 2, 3],
[2, 3, 4]
])
Und ich möchte eine Spalte mit Nullen hinzufügen, um ein Array zu erhalten. b
:
b = np.array([
[1, 2, 3, 0],
[2, 3, 4, 0]
])
Wie kann ich das in NumPy einfach machen?
a = np.random.rand((N,N))
zua = np.random.rand(N,N)
np.r_[ ... ]
undnp.c_[ ... ]
sind nützliche Alternativen zuvstack
undhstack
mit eckigen Klammern [] anstelle von round ().Einige Beispiele:
(Der Grund für eckige Klammern [] anstelle von round () ist, dass Python z. B. 1: 4 im Quadrat erweitert - die Wunder der Überladung.)
quelle
np.c_[ * iterable ]
. siehe Ausdruckslisten .Verwendung
numpy.append
:quelle
append
eigentlich nur anruftconcatenate
Eine Möglichkeit, hstack zu verwenden , ist:
quelle
dtype
Parameter, er wird nicht benötigt und ist sogar nicht erlaubt. Während Ihre Lösung elegant genug ist, achten Sie darauf, sie nicht zu verwenden, wenn Sie häufig an ein Array "anhängen" müssen. Wenn Sie nicht das gesamte Array auf einmal erstellen und später füllen können, erstellen Sie eine Liste der Arrays undhstack
alles auf einmal.Ich finde folgendes am elegantesten:
Ein Vorteil von
insert
ist, dass Sie damit auch Spalten (oder Zeilen) an anderen Stellen innerhalb des Arrays einfügen können. Anstatt einen einzelnen Wert einzufügen, können Sie auch ganz einfach einen ganzen Vektor einfügen, zum Beispiel die letzte Spalte duplizieren:Was dazu führt:
Das Timing
insert
könnte langsamer sein als die Lösung von JoshAdel:quelle
insert(a, -1, ...)
die Spalte nicht anhängen kann. Ich schätze, ich werde es stattdessen einfach voranstellen.a.shape[axis]
. I. e. Zum Anhängen einer Zeile tun Sie diesnp.insert(a, a.shape[0], 999, axis=0)
und für eine Spalte tun Sie diesnp.insert(a, a.shape[1], 999, axis=1)
.Ich war auch an dieser Frage interessiert und verglich die Geschwindigkeit von
die alle für jeden Eingabevektor dasselbe tun
a
. Zeitpunkte für das Wachstuma
:Beachten Sie, dass alle nicht zusammenhängenden Varianten (insbesondere
stack
/vstack
) möglicherweise schneller sind als alle zusammenhängenden Varianten.column_stack
(wegen seiner Klarheit und Geschwindigkeit) scheint eine gute Option zu sein, wenn Sie Kontiguität benötigen.Code zur Reproduktion der Handlung:
quelle
stack
,hstack
,vstack
,column_stack
,dstack
sind alle Funktionen Helfer oben auf gebautnp.concatenate
. Beim Durchlaufen der Definition des Stapels stellte ich fest, dass dernp.stack([a,a])
Aufruf erfolgtnp.concatenate([a[None], a[None]], axis=0)
. Es könnte schön sein,np.concatenate([a[None], a[None]], axis=0).T
das Perfplot zu ergänzen , um zu zeigen, dassnp.concatenate
es immer mindestens so schnell sein kann, wie sein Helfer funktioniert.c_
undcolumn_stack
Meiner Ansicht nach:
ist eleganter.
quelle
np.concatenate funktioniert auch
quelle
np.concatenate
scheint dreimal schneller zu sein alsnp.hstack
bei 2x1-, 2x2- und 2x3-Matrizen.np.concatenate
war in meinen Experimenten auch etwas schneller als das manuelle Kopieren der Matrizen in eine leere Matrix. Das stimmt mit der Antwort von Nico Schlömer überein.Angenommen, es
M
ist ein (100,3) ndarray undy
ein (100,) ndarrayappend
kann wie folgt verwendet werden:Der Trick ist zu verwenden
Dies wird
y
in ein (100, 1) 2D-Array konvertiert .jetzt gibt
quelle
Ich mag JoshAdels Antwort wegen des Fokus auf Leistung. Eine geringfügige Leistungsverbesserung besteht darin, den Aufwand für die Initialisierung mit Nullen zu vermeiden, nur um überschrieben zu werden. Dies hat einen messbaren Unterschied, wenn N groß ist, leer anstelle von Nullen verwendet wird und die Spalte mit Nullen als separater Schritt geschrieben wird:
quelle
b[:,-1] = 0
. Bei sehr großen Arrays wird der Leistungsunterschiednp.insert()
vernachlässigbar, wasnp.insert()
aufgrund seiner Prägnanz wünschenswerter sein könnte.np.insert
dient auch dem Zweck.Hier werden Werte
new_col
vor einem bestimmten Index hieridx
entlang einer Achse eingefügt. Mit anderen Worten, die neu eingefügten Werte belegen dieidx
Spalte und verschieben das, was ursprünglich dort und danach war,idx
rückwärts.quelle
insert
nicht vorhanden ist, wie unter dem Namen der Funktion angenommen werden könnte (siehe in der Antwort verknüpfte Dokumente).Fügen Sie einem numpy-Array eine zusätzliche Spalte hinzu:
Numpys
np.append
Methode verwendet drei Parameter, die ersten beiden sind 2D-Numpy-Arrays und der dritte ist ein Achsenparameter, der angibt, entlang welcher Achse angehängt werden soll:Drucke:
quelle
Ein bisschen zu spät zur Party, aber noch hat niemand diese Antwort gepostet. Der Vollständigkeit halber: Sie können dies mit Listenverständnis auf einem einfachen Python-Array tun:
quelle
Für mich sieht der nächste Weg ziemlich intuitiv und einfach aus.
quelle
In meinem Fall musste ich einem NumPy-Array eine Spalte mit Einsen hinzufügen
Nach X.shape => (97, 2)
quelle
Hierfür gibt es eine spezielle Funktion. Es heißt numpy.pad
Folgendes steht in der Dokumentationszeichenfolge:
quelle