Ich habe folgendes versucht:
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> np.concatenate((a,b), axis=0)
array([1, 2, 3, 4, 5, 6])
>>> np.concatenate((a,b), axis=1)
array([1, 2, 3, 4, 5, 6])
Ich würde jedoch zumindest erwarten, dass ein Ergebnis so aussieht
array([[1, 2, 3],
[4, 5, 6]])
Warum ist es nicht vertikal verkettet?
python
arrays
numpy
concatenation
toom
quelle
quelle
np.vstack((a,b))
für diesen Zweck verwenden (falls Sie es nicht wissen)vstack
ein Tupel ist. Mit anderen Worten,np.vstack((a,b))
ist das gleiche wie zu tunnp.vstack(tup=(a,b))
. Siehe hier: numpy.org/doc/stable/reference/generated/numpy.vstack.html( )
und nicht nach eckigen Klammern gefragt haben[ ]
Antworten:
Weil beide
a
undb
nur eine Achse haben, wie ihre Form ist(3)
, und der Achsenparameter sich speziell auf die Achse der zu verkettenden Elemente bezieht.Dieses Beispiel soll verdeutlichen, was
concatenate
mit der Achse geschieht. Nehmen Sie zwei Vektoren mit zwei Achsen und Form(2,3)
:a = np.array([[1,5,9], [2,6,10]]) b = np.array([[3,7,11], [4,8,12]])
verkettet entlang der 1. Achse (Reihen der 1., dann Reihen der 2.):
np.concatenate((a,b), axis=0) array([[ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11], [ 4, 8, 12]])
verkettet entlang der 2. Achse (Spalten der 1., dann Spalten der 2.):
np.concatenate((a, b), axis=1) array([[ 1, 5, 9, 3, 7, 11], [ 2, 6, 10, 4, 8, 12]])
Um die von Ihnen präsentierte Ausgabe zu erhalten, können Sie verwenden
vstack
a = np.array([1,2,3]) b = np.array([4,5,6]) np.vstack((a, b)) array([[1, 2, 3], [4, 5, 6]])
Sie können es immer noch tun
concatenate
, aber Sie müssen sie zuerst umformen:np.concatenate((a.reshape(1,3), b.reshape(1,3))) array([[1, 2, 3], [4, 5, 6]])
Wie in den Kommentaren vorgeschlagen, besteht eine Möglichkeit, sie umzugestalten, darin, Folgendes zu verwenden
newaxis
:quelle
np.concatenate([a[None,:],b[None,:]])
a.reshape(1,3)
ohne es zuzuweisen, anstatta=a.reshape(1,3)
?d=b.reshape(1,3)
? Funktioniert trotzdemconcatenate((c,d))
hier.vstack((a,b))
innp.vstack((a,b))
Wenn das eigentliche Problem darin besteht, zwei 1-D-Arrays vertikal zu verketten, und wir nicht darauf fixiert sind
concatenate
, diese Operation auszuführen, würde ich die Verwendung von np.column_stack vorschlagen :In []: a = np.array([1,2,3]) In []: b = np.array([4,5,6]) In []: np.column_stack((a, b)) array([[1, 4], [2, 5], [3, 6]])
quelle
Ein nicht bekanntes Merkmal von Numpy ist die Verwendung
r_
. Dies ist eine einfache Möglichkeit, Arrays schnell aufzubauen:import numpy as np a = np.array([1,2,3]) b = np.array([4,5,6]) c = np.r_[a[None,:],b[None,:]] print(c) #[[1 2 3] # [4 5 6]]
Der Zweck von
a[None,:]
besteht darin, dem Array eine Achse hinzuzufügena
.quelle
a = np.array([1,2,3]) b = np.array([4,5,6]) np.array((a,b))
funktioniert genauso gut wie
np.array([[1,2,3], [4,5,6]])
Unabhängig davon, ob es sich um eine Liste von Listen oder eine Liste von 1d-Arrays handelt, wird
np.array
versucht, ein 2d-Array zu erstellen.Es ist aber auch eine gute Idee zu verstehen, wie
np.concatenate
und seinestack
Funktionsfamilie funktionieren. In diesem Zusammenhang wirdconcatenate
eine Liste von 2D-Arrays (oder alles, wasnp.array
sich in ein 2D-Array verwandelt) als Eingabe benötigt.np.vstack
durchläuft zuerst die Eingänge, um sicherzustellen, dass sie mindestens 2d sind, und verkettet dann. Funktionell ist es dasselbe wie die Dimensionen der Arrays selbst zu erweitern.np.stack
ist eine neue Funktion, die die Arrays in einer neuen Dimension verbindet. Standard verhält sich genauso wienp.array
.Schauen Sie sich den Code für diese Funktionen an. Wenn Sie in Python geschrieben sind, können Sie einiges lernen. Für
vstack
:return _nx.concatenate([atleast_2d(_m) for _m in tup], 0)
quelle