Verlassen Sie sich nicht auf Floats für die Gleichheit zu vergleichen (es sei denn, Sie wissen genau, was Floats Sie beschäftigen). Da kennen Sie die Schrittgröße der Array 0,1 zu erzeugen, verwendet,
arr = np.arange(0, 1.1, 0.1)
Sie den Schwellenwert erhöhen könnte, 0,3, durch die Halb Schrittgrßenregister eine neue Schwelle zu finden, die sicher zwischen den Werten in arr
ist:
In [48]: stepsize = 0.1; arr[arr < 0.3+(stepsize/2)]
Out[48]: array([ 0. , 0.1, 0.2, 0.3])
By the way, die 1.1
in np.arange(0, 1.1, 0.1)
ist eine Anwendung der gleichen Idee - angesichts der Launen der Gleitkomma-Arithmetik, konnten wir nicht sicher sein, dass 1.0
in sein würde, Wenn wir np.arange(0, 1.0, 0.1)
geschrieben haben, wurde der rechte Endpunkt um die Schrittgröße erhöht.
Grundsätzlich läuft darauf hinaus das Problem auf floating-point arithmetic being inaccurate unten:
In [17]: 0.1+0.2 == 0.3
Out[17]: False
So ist der vierte Wert in dem Array ist ein wenig größer als 0,3 ist.
In [40]: arr = np.arange(0,1.1, 0.1)
In [41]: arr[3]
Out[41]: 0.30000000000000004
Beachten Sie, dass Rundung keine gangbare Lösung sein kann. Zum Beispiel wenn arr
hat dtype float128
:
In [53]: arr = np.arange(0, 1.1, 0.1, dtype='float128')
In [56]: arr[arr.round(1) <= 0.3]
Out[56]: array([ 0.0, 0.1, 0.2], dtype=float128)
Obwohl Herstellung die dtype float128
gemacht arr[3]
näher an die dezimalen 0,3,
In [54]: arr[3]
Out[54]: 0.30000000000000001665
nun Abrunden nicht produziert eine Zahl kleiner als 0,3:
In [55]: arr.round(1)[3]
Out[55]: 0.30000000000000000001
Well ... 'arr [arr. Runde (1) <= 0.3] 'funktioniert ... –
Also sollte ich * immer * Zahlen runden, bevor Sie irgendwelche Vergleiche machen? – Xiphias
Äquivalenz zwischen Schwimmern ist immer eine riskante Sache, um zu prüfen. –