Numpy: Unerwartete Ausgabe von arange mit dtype = int

Erstellt am 5. Mai 2020  ·  5Kommentare  ·  Quelle: numpy/numpy


In [3]: np.arange (-3, 0, 0,5, dtype = int)
Out [3]: Array ([- 3, -2, -1, 0, 1, 2])

Eine "1" und eine "2" zu sehen war für uns etwas unerwartet, da beide Zahlen etwas größer als 0 sind.

Normalerweise ist dies das Ergebnis ohne dtype = int:

In [2]: np.arange(-3, 0, 0.5)                                                  
Out[2]: array([-3. , -2.5, -2. , -1.5, -1. , -0.5])
and we should get this with dtype=int:
In [4]: np.arange(-3, 0, 0.5).astype(int)                                      
Out[4]: array([-3, -2, -2, -1, -1,  0])

Das numpy-Handbuch besagt:
dtype: dtype
Der Typ des Ausgabearrays. Wenn dtype nicht angegeben ist, leiten Sie den Datentyp aus den anderen Eingabeargumenten ab.

Es sollte also nur das Ausgabearray betreffen, oder?

import numpy as np
print(np.arange(-3, 0, 0.5))
print(np.arange(-3, 0, 0.5, dtype=int))
print(np.arange(-3, 0, 0.5).astype(int))

Fehlermeldung:

Keine Fehlermeldung ...

Informationen zur Numpy / Python-Version:

Wir haben es unter der Nummer '1.18.4' (reines Python 3.7.6) sowie unter '1.18.1' (Anaconda 3.7 mit dem neuesten Update) getestet. Gleiches Ergebnis.

1.18.4 3.7.6 (Standard, 28. Februar 2020, 15:25:38)
[Clang 11.0.0 ( https://github.com/llvm/llvm-project.git eefbff0082c5228e01611f7

1.18.1 3.7.4 (Standard, 13. August 2019, 20:35:49)
[GCC 7.3.0]

00 - Bug numpy.core

Hilfreichster Kommentar

Werte zu erhalten, die größer als "Stop" sind, ist wirklich nicht schön und ein bisschen unerwartet. Wenn arange nicht für float ist, können Sie nach den floaty numpy-Typen suchen und eine Ausnahme auslösen.

Auch der manuelle Eintrag für dtype lässt den Benutzer wirklich so etwas wie eine Astype-Konvertierung (dtype) nur der Ausgabe erwarten.

Wie wäre es mit:
1.) Ausnahme für nicht ganzzahlige Argumente (dh Start, Stopp, Schritt).
2.) Überprüfen Sie, ob stop> = start ist, andernfalls wird eine Ausnahme ausgelöst
3.) Start, Stopp, Schritt zu int64 am Anfang der Funktion.
4.) Astype (dtype) der Ausgabe

Anstelle von 1.) können Sie innerhalb von arange zum Linspace umleiten, wenn eine nicht ganzzahlige Eingabe gefunden wird.

Alle 5 Kommentare

Fehler wie diese werden immer wieder gemeldet. Aus zeitlichen Gründen bin ich ziemlich zuversichtlich, dass die Implementierung von arange ungefähr so ​​aussieht:

def arange(start, stop, step, dtype):
    n = (start - stop) // step

    # dtype.type is a cast
    step = dtype.type(start + step) - dtype.type(start)

    # now do what you expect
    return [start + step*i for i in range(n)]

Vielleicht sollten wir diesen Pseudocode zur Dokumentation hinzufügen?

Ja, dieser Code ist korrekt (nicht 100% sicher über die n Berechnung). Dieses spezielle Beispiel ist ziemlich extrem und offensichtlich kaputt. Vielleicht können wir es tatsächlich irgendwie loswerden?

arange wird wiederholt für die wohl gebrochene Definition gehasst, aber ich kann mir keinen wirklich guten Vorschlag vorstellen, um sie anzusprechen (obwohl vielleicht einer vorher aufgetaucht ist).
Es ist nicht so, dass wir das Verhalten von arange für Floats gut ändern können (möglicherweise Präzisionskorrekturen, aber Endpunktänderungen sind keine gute IMO). Wir müssten also eine neue Funktion erstellen ... Aber in den meisten Fällen scheint mir linspace besser zu sein als ein "korrekter" Float-Bereich. Ich bin mir nicht sicher, ob ein korrigierter Float-Bereich tatsächlich vorhanden ist zu viele Anwendungsfälle.

Am Ende hätte ich wohl gerne einen gut durchdachten Vorschlag: / ...

Werte zu erhalten, die größer als "Stop" sind, ist wirklich nicht schön und ein bisschen unerwartet. Wenn arange nicht für float ist, können Sie nach den floaty numpy-Typen suchen und eine Ausnahme auslösen.

Auch der manuelle Eintrag für dtype lässt den Benutzer wirklich so etwas wie eine Astype-Konvertierung (dtype) nur der Ausgabe erwarten.

Wie wäre es mit:
1.) Ausnahme für nicht ganzzahlige Argumente (dh Start, Stopp, Schritt).
2.) Überprüfen Sie, ob stop> = start ist, andernfalls wird eine Ausnahme ausgelöst
3.) Start, Stopp, Schritt zu int64 am Anfang der Funktion.
4.) Astype (dtype) der Ausgabe

Anstelle von 1.) können Sie innerhalb von arange zum Linspace umleiten, wenn eine nicht ganzzahlige Eingabe gefunden wird.

Hey, ich bin ein absoluter Anfänger im Open Source-Beitrag. Ich dachte daran, es zu versuchen. Wie wäre es mit diesem Ausschnitt? @ Eric-Wieser

x = []
for i in range(start, stop):
    x.append(i)
    x.append(i+step)
print(np.array(x, dtype))

Fehler wie diese werden immer wieder gemeldet. Aus zeitlichen Gründen bin ich ziemlich zuversichtlich, dass die Implementierung von arange ungefähr so ​​aussieht:

def arange(start, stop, step, dtype):
    n = (start - stop) // step

    # dtype.type is a cast
    step = dtype.type(start + step) - dtype.type(start)

    # now do what you expect
    return [start + step*i for i in range(n)]
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

dcsaba89 picture dcsaba89  ·  3Kommentare

keithbriggs picture keithbriggs  ·  3Kommentare

perezpaya picture perezpaya  ·  4Kommentare

toddrjen picture toddrjen  ·  4Kommentare

astrofrog picture astrofrog  ·  4Kommentare