Untuk nilai tertentu, astropy.units.allclose
tidak cocok dengan numpy.allclose
I/O harus sama, kecuali pertimbangan unit.
Saat membandingkan dua angka di mana array pertama memiliki elemen yang sangat dekat dengan 0 dan array kedua semuanya nol, numpy allclose berfungsi seperti yang diharapkan, tetapi units.allclose
mengembalikan False, terlepas dari "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 | dikemas oleh conda-forge | (default, 24 Apr 2020, 07:56:27)
[Dentang 9.0.1]
Numpy 1.18.4
astropi 4.2.dev877+g4eef52a1c
Scipy 1.4.1
Matplotlib 3.2.1
Ini sebenarnya bukan bug, tetapi perbedaan konseptual antara bagaimana allclose
dapat beroperasi pada input tanpa unit dan unit penuh. Sebagai catatan docstring dari numpy.allclose
:
Jika persamaan berikut adalah True dari segi elemen, maka allclose mengembalikan True.
mutlak(a - b) <= (atol + rtol * mutlak(b))
Dalam numpy.allclose
, atol=1e-8
(secara default) karena bisa ada perbandingan yang benar-benar mutlak tanpa harus menskalakan input. Dalam kasus astropy.units.allclose
, tidak ada cara alami untuk menyetel atol
karena akan bergantung pada unit. Jika Anda melihat tanda tangan panggilan dari dua fungsi, Anda akan melihat bahwa atol=None
di astropy.units.allclose
. Jika Anda menetapkan atol
dalam kasus unit, Anda mendapatkan hasil yang sama:
>>> u.allclose([1e-17, 0, 0] * u.m, [0, 0, 0] * u.m, rtol=1e-5, atol=1e-8*u.m)
True
@nstarman Apakah itu akan membantu Anda jika ada catatan eksplisit tentang ini di docstring astropy.units.allclose
?
Itu akan sangat berguna. Penjelasan yang Anda tulis di atas pasti sudah sempurna.
Komentar yang paling membantu
Ini sebenarnya bukan bug, tetapi perbedaan konseptual antara bagaimana
allclose
dapat beroperasi pada input tanpa unit dan unit penuh. Sebagai catatan docstring darinumpy.allclose
:Dalam
numpy.allclose
,atol=1e-8
(secara default) karena bisa ada perbandingan yang benar-benar mutlak tanpa harus menskalakan input. Dalam kasusastropy.units.allclose
, tidak ada cara alami untuk menyetelatol
karena akan bergantung pada unit. Jika Anda melihat tanda tangan panggilan dari dua fungsi, Anda akan melihat bahwaatol=None
diastropy.units.allclose
. Jika Anda menetapkanatol
dalam kasus unit, Anda mendapatkan hasil yang sama: