Astropy: `amount_allclose` отличается от numpy` allclose`

Созданный на 18 окт. 2020  ·  3Комментарии  ·  Источник: astropy/astropy

Описание

Для определенных значений 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

Close? question units

Самый полезный комментарий

На самом деле это не ошибка, а концептуальная разница между тем, как 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

Все 3 Комментарий

На самом деле это не ошибка, а концептуальная разница между тем, как 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 было явное примечание об этом?

Это было бы очень полезно. Объяснение, которое вы написали выше, было бы идеальным.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги