Astropy: `quantity_allclose` différence avec numpy `allclose`

Créé le 18 oct. 2020  ·  3Commentaires  ·  Source: astropy/astropy

La description

Pour certaines valeurs, astropy.units.allclose ne correspond pas à numpy.allclose

Comportement prévisible

Les E/S doivent être les mêmes, à l'exception des considérations d'unité.

Comportement réel

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"

Étapes pour reproduire

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

Détails du système

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

Close? question units

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

Tous les 3 commentaires

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.

Cette page vous a été utile?
0 / 5 - 0 notes