Для определенных значений astropy.units.allclose
не соответствует numpy.allclose
Ввод-вывод должен быть таким же, за исключением характеристик устройства.
При сравнении двух чисел, где в первом массиве элементы очень близки к 0, а во втором массиве все нули, numpy allclose работает должным образом, но units.allclose
возвращает False, независимо от "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 | упаковано conda-forge | (по умолчанию, 24 апреля 2020 г., 07:56:27)
[Clang 9.0.1]
Numpy 1.18.4
астропия 4.2.dev877 + g4eef52a1c
Scipy 1.4.1
Матплотлиб 3.2.1
На самом деле это не ошибка, а концептуальная разница между тем, как allclose
может работать с безразмерным и единичным вводом. В качестве строки документации numpy.allclose
notes:
Если следующее уравнение поэлементно верно, то allclose возвращает True.
абсолютный (a - b) <= (atol + rtol * absolute (b))
В numpy.allclose
, atol=1e-8
(по умолчанию), потому что может быть действительно абсолютное сравнение без необходимости масштабирования входных данных. В случае astropy.units.allclose
нет естественного способа установить atol
потому что это будет зависеть от единиц. Если вы посмотрите на сигнатуры вызовов двух функций, вы увидите, что atol=None
в astropy.units.allclose
. Если вы установите atol
в случае единиц, вы получите те же результаты:
>>> u.allclose([1e-17, 0, 0] * u.m, [0, 0, 0] * u.m, rtol=1e-5, atol=1e-8*u.m)
True
@nstarman Помогло бы вам, если бы в строке документации astropy.units.allclose
было явное примечание об этом?
Это было бы очень полезно. Объяснение, которое вы написали выше, было бы идеальным.
Самый полезный комментарий
На самом деле это не ошибка, а концептуальная разница между тем, как
allclose
может работать с безразмерным и единичным вводом. В качестве строки документацииnumpy.allclose
notes:В
numpy.allclose
,atol=1e-8
(по умолчанию), потому что может быть действительно абсолютное сравнение без необходимости масштабирования входных данных. В случаеastropy.units.allclose
нет естественного способа установитьatol
потому что это будет зависеть от единиц. Если вы посмотрите на сигнатуры вызовов двух функций, вы увидите, чтоatol=None
вastropy.units.allclose
. Если вы установитеatol
в случае единиц, вы получите те же результаты: