Numpy: BUG: Die Dimensionserkennung schlägt fehl, wenn Skalare und Shape == (1,) Arrays gemischt werden

Erstellt am 9. Dez. 2019  ·  5Kommentare  ·  Quelle: numpy/numpy

np.array([0.25, np.array([0.3])]) kann kein Float-Array erstellen, der dtype ist ein Objekt.

Das scheint mir falsch zu sein, ist es beabsichtigt?

00 - Bug numpy.dtype

Alle 5 Kommentare

Cc @nschloe , der gegen diese Art von Dingen ist und auf ihr Problem verlinken kann

Danke für CCing. Ja, das sieht wirklich nach etwas aus, über das ich gesprochen habe. : smiley_cat: https://github.com/numpy/numpy/issues/10404

Ich würde argumentieren, dass das Erstellen eines Objektarrays hier das Richtige ist. Schließlich setzen Sie einen Float und ein Array zusammen. Wenn Sie eine Python-Liste erstellt haben,

[0.25, np.array([0.3])]

Sie würden dasselbe erwarten: Der erste Eintrag ist ein Float, der zweite ein Array der Länge 1. Es wäre verwirrend, wenn sich Listen und np.arrays hier unterschiedlich verhalten würden.

Außerdem würde das implizite Erstellen eines Float-Arrays vom Typ dtype es unmöglich machen, jemals ein Array von [float, vector[1]] zu erstellen, selbst wenn ich dies wollte.

Die Angabe von np.array([0.25, np.array([0.3])]) erfolgt meistens versehentlich und kann leicht behoben werden. siehe z. B. https://github.com/scipy/scipy/pull/11147/files#diff -21a6a0b0d89357857304bfba2da5a971L321. Nach alldem,

Explizit ist besser als implizit.

OK, schließen. Diese PR hätte die jüngsten NEP 34-Änderungen (seitdem rückgängig gemacht) für Scipy weniger störend gemacht.

@nschloe

Das implizite Erstellen eines Float-Arrays vom Typ dtype würde es unmöglich machen, jemals ein Array [float, vector [1]] zu erstellen, selbst wenn ich dies wollte.

Für die Aufzeichnung könnten Sie np.array(0.3, np.array([0.3]), dtype=object) tun.

Wenn Sie eine Python-Liste erstellt haben ...

NumPy ndarrays unterscheiden sich stark von Python-Listen. Das hätte ich nicht erwartet
np.array([0.2, 0.3, 0.4]) würde ein Objektarray erstellen, obwohl ich nicht np.float64 für den dtype angegeben habe. Wir sind uns also einig, dass wir mit einer gewissen Stufe der automatischen, wertbasierten Erkennung von D-Typen vertraut sind. Die Frage ist, was Vorrang haben soll: numerische Typen oder Objekttypen.

Wir sind uns also einig, dass wir mit einer gewissen Stufe der automatischen, wertbasierten Erkennung von D-Typen vertraut sind.

Die "Automatisierung" ist hier ziemlich klar, denke ich: Immer den "niedrigsten" Datentyp erhalten, der alle Eingabewerte erfassen kann:

numpy.array([1, 2]).dtype   # int64
numpy.array([1, numpy.array(2)]).dtype  # int64, array of rank 0 are basically scalars
numpy.array([1.0, 2]).dtype   # float64
numpy.array([1, [2]]).dtype   # O
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

marcocaccin picture marcocaccin  ·  4Kommentare

Levstyle picture Levstyle  ·  3Kommentare

kevinzhai80 picture kevinzhai80  ·  4Kommentare

inducer picture inducer  ·  3Kommentare

manuels picture manuels  ·  3Kommentare