Wann sollte ich hstack / vstack vs append vs concatenate vs column_stack verwenden?

78

Einfache Frage: Was ist der Vorteil jeder dieser Methoden? Es scheint, dass bei den richtigen Parametern (und Ndarray-Formen) alle scheinbar gleichwertig funktionieren. Arbeiten Sie an Ort und Stelle? bessere Leistung haben? Welche Funktionen soll ich wann nutzen?

Stefan Sullivan
quelle

Antworten:

40

Alle Funktionen außer in Python sind geschrieben np.concatenate. Mit einer IPython-Shell verwenden Sie einfach ??.

Wenn nicht, hier eine Zusammenfassung ihres Codes:

vstack
concatenate([atleast_2d(_m) for _m in tup], 0)
i.e. turn all inputs in to 2d (or more) and concatenate on first

hstack
concatenate([atleast_1d(_m) for _m in tup], axis=<0 or 1>)

colstack
transform arrays with (if needed)
    array(arr, copy=False, subok=True, ndmin=2).T

append
concatenate((asarray(arr), values), axis=axis)

Mit anderen Worten, alle arbeiten, indem sie die Abmessungen der Eingabearrays anpassen und dann auf der rechten Achse verketten. Sie sind nur Komfortfunktionen.


Und neuer np.stack:

arrays = [asanyarray(arr) for arr in arrays]
shapes = set(arr.shape for arr in arrays)
result_ndim = arrays[0].ndim + 1
axis = normalize_axis_index(axis, result_ndim)
sl = (slice(None),) * axis + (_nx.newaxis,)

expanded_arrays = [arr[sl] for arr in arrays]
concatenate(expanded_arrays, axis=axis, out=out)

Das heißt, es erweitert die Abmessungen aller Eingänge (ein bisschen wie np.expand_dims) und verkettet dann. Mit axis=0ist der Effekt der gleiche wie np.array.

hstack Dokumentation fügt jetzt hinzu:

Die Funktionen concatenate, stackund blockbieten allgemeinere Stapel- und Verkettung Operationen.

np.blockist auch neu. Tatsächlich verkettet es rekursiv entlang der verschachtelten Listen.

hpaulj
quelle
21

numpy.vstack: Stapelarrays in vertikaler Reihenfolge (zeilenweise). Entspricht dem np.concatenate(tup, axis=0) Beispiel: https://docs.scipy.org/doc/numpy/reference/generated/numpy.vstack.html

numpy.hstack: Stapelt Arrays nacheinander horizontal (spaltenweise). Entspricht np.concatenate(tup, axis=1), mit Ausnahme von 1-D-Arrays, bei denen sie entlang der ersten Achse verkettet sind. Beispiel siehe: https://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html

append ist eine Funktion für die in Python integrierte Datenstruktur list. Jedes Mal, wenn Sie der Liste ein Element hinzufügen. Um mehrere Elemente hinzuzufügen, verwenden Sie natürlich extend. Einfach ausgedrückt sind die Funktionen von numpy viel leistungsfähiger.

Beispiel:

Angenommen, grey.shape = (n0, n1)

np.vstack((gray,gray,gray)) wird Form haben (n0 * 3, n1), können Sie es auch tun np.concatenate((gray,gray,gray),axis=0)

np.hstack((gray,gray,gray)) wird Form haben (n0, n1 * 3), können Sie es auch tun np.concatenate((gray,gray,gray),axis=1)

np.dstack((gray,gray,gray)) wird Form haben (n0, n1,3).

Yuchao Jiang
quelle
14

In IPython können Sie den Quellcode einer Funktion anzeigen, indem Sie ihren Namen gefolgt von eingeben ??. Ein Blick auf hstackuns zeigt, dass es sich eigentlich nur um einen Wrapper handelt concatenate(ähnlich wie bei vstackund column_stack):

np.hstack??
def hstack(tup):
...
    arrs = [atleast_1d(_m) for _m in tup]
    # As a special case, dimension 0 of 1-dimensional arrays is "horizontal"
    if arrs[0].ndim == 1:
        return _nx.concatenate(arrs, 0)
    else:
        return _nx.concatenate(arrs, 1)

Verwenden Sie also einfach den Namen, der für Sie am logischsten klingt.

maxymoo
quelle