Pour certaines valeurs, astropy.units.allclose
ne correspond pas à numpy.allclose
Les E/S doivent être les mêmes, à l'exception des considérations d'unité.
Lors de la comparaison de deux nombres où le premier tableau a des éléments très proches de 0 et le deuxième tableau est entièrement composé de zéros, numpy allclose fonctionne comme prévu, mais units.allclose
renvoie False, quel que soit le "rtol"
>>> 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 | emballé par conda-forge | (par défaut, 24 avril 2020, 07:56:27)
[Clang 9.0.1 ]
Numpy 1.18.4
astropie 4.2.dev877+g4eef52a1c
Scipy 1.4.1
Matplotlib 3.2.1
Ce n'est pas vraiment un bogue, mais une différence conceptuelle entre la façon dont allclose
peut fonctionner sur une entrée sans unité et avec une unité complète. Comme le note la docstring de numpy.allclose
:
Si l'équation suivante est True au niveau des éléments, alors allclose renvoie True.
absolu(a - b) <= (atol + rtol * absolu(b))
Dans numpy.allclose
, atol=1e-8
(par défaut) car il peut y avoir une comparaison vraiment absolue sans avoir à mettre à l'échelle les entrées. Dans le cas de astropy.units.allclose
, il n'y a pas de moyen naturel de définir atol
car cela dépendra des unités. Si vous regardez les signatures d'appel des deux fonctions, vous verrez que atol=None
dans astropy.units.allclose
. Si vous définissez atol
dans le cas des unités, vous obtenez les mêmes résultats :
>>> u.allclose([1e-17, 0, 0] * u.m, [0, 0, 0] * u.m, rtol=1e-5, atol=1e-8*u.m)
True
@nstarman Cela vous aurait-il aidé s'il y avait une note explicite à ce sujet dans la docstring de astropy.units.allclose
?
Ce serait très utile. L'explication que vous avez écrite ci-dessus aurait été parfaite.
Commentaire le plus utile
Ce n'est pas vraiment un bogue, mais une différence conceptuelle entre la façon dont
allclose
peut fonctionner sur une entrée sans unité et avec une unité complète. Comme le note la docstring denumpy.allclose
:Dans
numpy.allclose
,atol=1e-8
(par défaut) car il peut y avoir une comparaison vraiment absolue sans avoir à mettre à l'échelle les entrées. Dans le cas deastropy.units.allclose
, il n'y a pas de moyen naturel de définiratol
car cela dépendra des unités. Si vous regardez les signatures d'appel des deux fonctions, vous verrez queatol=None
dansastropy.units.allclose
. Si vous définissezatol
dans le cas des unités, vous obtenez les mêmes résultats :