Überprüfen Sie, ob Schwimmer ist in der Nähe float gespeichert in array
Ich brauche, um zu überprüfen, ob ein bestimmter float ist zu schließen, innerhalb einer gegebenen Toleranz zu jeder float - in ein array von floats.
import numpy as np
# My float
a = 0.27
# The tolerance
t = 0.01
# Array of floats
arr_f = np.arange(0.05, 0.75, 0.008)
Gibt es eine einfache Möglichkeit, dies zu tun? So etwas wie if a in arr_f:
aber so für eine gewisse Toleranz in der Differenz?
Hinzufügen
Durch "zulassen-Toleranz" - ich meine das in folgendem Sinne:
for i in arr_f:
if abs(a - i) <= t:
print 'float a is in arr_f within tolerance t'
break
- suchen Sie eine Lösung, die einfach zu schreiben und zu pflegen oder benötigen Sie einen anspruchsvollen Ansatz, um eine bessere Leistung erzielen?
- ich denke
numpy.isclose(a,arr_f, atol=t)
ist die beste Antwort, wie Sie unten sehen! - warum ist das besser als
(abs(arr_f - a) < t).any()
? - deine Antwort ist auch gut , aber andere useed
numpy
Methode ! und Ihr Vorteil, wenn Sie dies ! - Ich denke nicht, dass das relevant ist, zumal dieser Ansatz ist schneller, aber ich denke jedem das seine, lol 🙂
- Oft (aber nicht unbedingt in deinem Fall), du willst einen relativen Fehler, entlang der Linien von
abs(arr_f - a) / max(abs(arr_f), abs(a))
und einen Wert für die Toleranz von vielleicht1E-5
oder1E-6
. Ich erwarte, dass numpy bietet einen Mechanismus für die, auch; dieisclose()
- Methode könnte es geben — in der Tat, statt deratol=t
vorgeschlagen, Sie könnte verwendenrtol=t
geben Sie einen relativen Toleranz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie über die Verwendung
np.isclose
?np.isclose
vergleicht zwei Objekte, die element-Weise zu sehen, wenn die Werte innerhalb einer vorgegebenen Toleranz (hier angegeben durch das Schlüsselwort-argumentatol
ist die absolute Differenz zwischen zwei Elementen). Die Funktion gibt ein Boolesches array.Wenn Sie nur daran interessiert sind, in einem
True
/False
Ergebnis, dann sollte dies funktionieren:Erklärung:
abs(arr_f - a) < t
gibt einen boolean-array auf dieany()
wird aufgerufen, um herauszufinden, ob alle seiner Werte istTrue
.BEARBEITEN - Vergleich dieses Ansatzes und die vorgeschlagen die andere Antwort zeigt, dass dieser etwas schneller:
Eine alternative Lösung, die zudem liefert die relevanten Indizes ist wie folgt:
Dies bedeutet, dass die Werte, die Ihren Wohnsitz in den Indizes 27 und 28 des
arr_f
sind innerhalb des gewünschten Bereiches, und in der Tat:Mit diesem Ansatz kann auch erzeugen eine
True
/False
Ergebnis: