Von vstack
docs:
Unterschrift:
hstack(tup)
Docstring:
Stapeln Sie Arrays nacheinander horizontal (spaltenweise).Dies entspricht einer Verkettung entlang der zweiten Achse, mit Ausnahme von 1-D
Arrays, in denen es entlang der ersten Achse verkettet.
Meine Frage ist warum die Ausnahme ???
Wir haben bereits concatenate()
.
v = rand(5)
concatenate((v, v)).shape
(10,)
hstack((v, v)).shape
(10,)
stack((v, v), axis=1).shape
(5, 2)
vstack((v, v)).shape
(2, 5)
stack((v, v), axis=0).shape
(2, 5)
Es wäre viel sinnvoller, vstack = stack(axis=1)
.
Wir ermutigen nicht zu hstack / vstack / dstack, und wir ermutigen stattdessen speziell np.stack
. Der Unterschied besteht jedoch darin, dass Sie ein 2D-Array übergeben. Einige der Stapelfunktionen fügen neue Dimensionen ein (für bestimmte Inkarnationen), ich denke, hstack
nicht.
Das Hinzufügen eines letzten Satzes, der besagt, dass entweder np.concatenate
oder np.stack
die bevorzugte API sind (normalerweise), wäre in Ordnung, aber ich glaube nicht, dass wir echte Ambitionen haben, die Funktionen zu löschen.
Meine Frage ist _warum die Ausnahme _ ???
Nur weil @seberg dies nicht direkt beantwortet hat:
1D-Arrays werden im Allgemeinen als "horizontal" in numpy und nicht als "vertikal" behandelt. Wenn Sie beispielsweise ein (N, N)
2D-Array mit einem (N,)
1D-Array senden, wird das 1D-Array an (1, N)
und nicht an (N, 1)
gesendet. hstack()/vstack()/dstack()
basiert nicht auf Konzepten konstanter Achsen (Sie können stack()
wenn Sie das möchten), sondern auf Konzepten von "horizontal / vertikal / Tiefe", die nicht genau auf feste Achsen abgebildet werden alle Array-Dimensionen.
Ich bin -1 in der Sprache, die hstack()/vstack()/dstack()
per se entmutigt. Ich denke immer noch, dass sie gut und nützlich sind, weil die Ausnahmen in ihrer Semantik. Sie erfassen Konzepte, die von stack()
nicht präzise erfasst werden.
Beispielsweise muss häufig ein Skalarwert an ein 1D-Array angehängt oder angehängt werden. np.hstack([0.0, some_vector])
funktioniert hierfür hervorragend. np.stack([0.0, some_vector])
und np.concatenate([0.0, some_vector])
blockieren, weil sie nicht die gleiche Dimension haben.
Es stimmt, diese Tools hängen einfach ein bisschen mit der Arbeit in einem bestimmten Kontext zusammen, denke ich. Schließen wir das also einfach. Wir haben die generischen Tools ohne "funky" Verhalten, und die anderen sind da, um zu bleiben, wenn sie gute Dienstprogramme sind.
@rkern , dann muss concatenate
repariert werden, IMHO. Stapeln bedeutet Verketten nach dem Hinzufügen eines zusätzlichen Dim, was hier nicht berücksichtigt wird. Aber okay…
@seberg , scheint hier eine Abwertungswarnung willkommen zu sein. Ein 1D-Array ist weder horizontal noch vertikal. Und hstack
fällt auf concatenate
und vergisst, eine zusätzliche Dimension hinzuzufügen. Das sieht in der Tat "funky" aus. Aber wenn Sie nicht bereit sind zu diskutieren, na ja ...
Alle anderen ?stack
-Funktionen fügen zusätzliche Dims nur hinzu, wenn die Dims niedriger sind als die, die für die aktuelle Operation erforderlich sind. In diesem Fall umfasst das nur 0d.
@Atcold Ich bin offen für Vorschläge, um Benutzer zu stack
bewegen , aber wahrscheinlich innerhalb der Grenzen, sie nicht aktiv von der Verwendung dieser Funktionen abzuhalten.