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))
Keine Fehlermeldung ...
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]
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)]
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.