Bei bestimmten Werten stimmt astropy.units.allclose
nicht mit numpy.allclose
überein
Die E/A muss mit Ausnahme der Einheitenüberlegungen gleich sein.
Beim Vergleich zweier Zahlen, bei denen das erste Array Elemente enthält, die sehr nahe bei 0 liegen und das zweite Array nur Nullen enthält, funktioniert numpy allclose wie erwartet, aber units.allclose
gibt unabhängig von "rtol" False zurück
>>> import numpy as np
>>> np.allclose([1e-17, 0, 0], [0, 0, 0], rtol=1e-5)
True
>>> import astropy.units as u
>>> u.allclose([1e-17, 0, 0] * u.m, [0, 0, 0] * u.m, rtol=1e-5)
False
macOS-10.15.7-x86_64-i386-64bit
Python 3.8.2 | verpackt von conda-forge | (Standard, 24. April 2020, 07:56:27)
[Klang 9.0.1 ]
Numpy 1.18.4
Astropie 4.2.dev877+g4eef52a1c
Scipy 1.4.1
Matplotlib 3.2.1
Dies ist nicht wirklich ein Fehler, sondern ein konzeptioneller Unterschied zwischen der Art und Weise, wie allclose
mit einheitenlosen und einheitenvollen Eingaben arbeiten kann. Wie der Docstring von numpy.allclose
feststellt:
Wenn die folgende Gleichung elementweise True ist, gibt allclose True zurück.
absolut(a - b) <= (atol + rtol * absolut(b))
In numpy.allclose
, atol=1e-8
(standardmäßig), weil es einen wirklich absoluten Vergleich geben kann, ohne die Eingaben skalieren zu müssen. Im Fall von astropy.units.allclose
gibt es keine natürliche Möglichkeit, atol
da dies von Einheiten abhängt. Wenn Sie sich die Rufsignaturen der beiden Funktionen ansehen, sehen Sie, dass atol=None
in astropy.units.allclose
. Wenn Sie atol
im Einheitenfall festlegen, erhalten Sie die gleichen Ergebnisse:
>>> u.allclose([1e-17, 0, 0] * u.m, [0, 0, 0] * u.m, rtol=1e-5, atol=1e-8*u.m)
True
@nstarman Hätte es dir geholfen, wenn es einen expliziten Hinweis dazu im Docstring von astropy.units.allclose
gäbe?
Das wäre sehr nützlich. Die Erklärung, die Sie oben geschrieben haben, wäre perfekt gewesen.
Hilfreichster Kommentar
Dies ist nicht wirklich ein Fehler, sondern ein konzeptioneller Unterschied zwischen der Art und Weise, wie
allclose
mit einheitenlosen und einheitenvollen Eingaben arbeiten kann. Wie der Docstring vonnumpy.allclose
feststellt:In
numpy.allclose
,atol=1e-8
(standardmäßig), weil es einen wirklich absoluten Vergleich geben kann, ohne die Eingaben skalieren zu müssen. Im Fall vonastropy.units.allclose
gibt es keine natürliche Möglichkeit,atol
da dies von Einheiten abhängt. Wenn Sie sich die Rufsignaturen der beiden Funktionen ansehen, sehen Sie, dassatol=None
inastropy.units.allclose
. Wenn Sieatol
im Einheitenfall festlegen, erhalten Sie die gleichen Ergebnisse: