Astropy: `quantity_allclose` Unterschied zu numpy `allclose`

Erstellt am 18. Okt. 2020  ·  3Kommentare  ·  Quelle: astropy/astropy

Beschreibung

Bei bestimmten Werten stimmt astropy.units.allclose nicht mit numpy.allclose überein

Erwartetes Verhalten

Die E/A muss mit Ausnahme der Einheitenüberlegungen gleich sein.

Tatsächliches Verhalten

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

Schritte zum Reproduzieren

>>> 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

Systemdetails

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

Close? question units

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 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

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen