Verketten Sie zwei NumPy-Arrays vertikal

73

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?

toom
quelle
7
seltsam !!! Sie können np.vstack((a,b))für diesen Zweck verwenden (falls Sie es nicht wissen)
Abid Rahman K
Leute, entschuldigt den dummen Kommentar, aber warum benutzt ihr bei vstack zweimal Klammern?
Dmitry Isakov
1
@DmitryIsakov Keine Sorge, es ist kein dummer Kommentar. numpy tut dies, weil das einzige erforderliche Argument bei der Verwendung vstackein Tupel ist. Mit anderen Worten, np.vstack((a,b))ist das gleiche wie zu tun np.vstack(tup=(a,b)). Siehe hier: numpy.org/doc/stable/reference/generated/numpy.vstack.html
Ian
1
@DmitryIsakov unter der Annahme, dass Sie natürlich nach Klammern ( )und nicht nach eckigen Klammern gefragt haben[ ]
Ian

Antworten:

93

Weil beide aund bnur 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 concatenatemit 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:

np.concatenate((a[np.newaxis,:], b[np.newaxis,:]))
gg349
quelle
Sind Sie sicher, dass die Umgestaltung funktionieren wird? Bei mir hat es nicht funktioniert.
Abid Rahman K
7
Versuchen Sienp.concatenate([a[None,:],b[None,:]])
wim
1
ja tut es. Vielleicht bist du gelaufen, a.reshape(1,3)ohne es zuzuweisen, anstatt a=a.reshape(1,3)?
gg349
seltsam. Ich nehme an, Sie haben es dann getan d=b.reshape(1,3)? Funktioniert trotzdem concatenate((c,d))hier.
gg349
2
Bitte bearbeiten Sie die Antwort und ändern Sie sie vstack((a,b))innp.vstack((a,b))
Mitarbeiter
25

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]])
Kshitij Saraogi
quelle
10

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ügen a.

Bougui
quelle
6
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.arrayversucht, ein 2d-Array zu erstellen.

Es ist aber auch eine gute Idee zu verstehen, wie np.concatenateund seine stackFunktionsfamilie funktionieren. In diesem Zusammenhang wird concatenateeine Liste von 2D-Arrays (oder alles, was np.arraysich in ein 2D-Array verwandelt) als Eingabe benötigt.

np.vstackdurchlä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.stackist eine neue Funktion, die die Arrays in einer neuen Dimension verbindet. Standard verhält sich genauso wie np.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)
hpaulj
quelle