Numpy: Funky vstack

Erstellt am 22. Juli 2020  ·  7Kommentare  ·  Quelle: numpy/numpy

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() .

Beispiel für die Wiedergabe von Code:

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) .

33 - Question

Alle 7 Kommentare

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:

  • Jemand hielt es vor langer Zeit für eine gute Idee
  • Jetzt ist es zu spät, um es zu ändern, ohne alle zu brechen

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen