Я пытаюсь создать эквивалент astropy.units для преобразования между различными единицами UV-координат при работе с интерферометрическими астрономическими данными. Самый распространенный способ сохранения координат - в секундах, однако я обычно конвертирую непосредственно в лямбды (в зависимости от длины волны / частоты покоя). Я хочу иметь возможность выбирать между: (нано) секундами - (килограммами) лямбда-метрами. Входными данными, которые необходимы для преобразования, является частота покоя отдельных наблюдений.
Первоначальное описание метода:
На данный момент я придумал следующее.
import astropy.units as un
import astropy.constants as co
restfreq_hz = 203e9 #203 Ghz
lambdas = un.def_unit('lambdas', format={'format' : r'\lambda'})
klambdas = un.def_unit('kilolambdas', format={'format' : r'k\lambda'})
# equivalency (from_unit, to_unit, forward, backward)
lambdas_equivalencies = [
(lambdas, un.s, lambda x: x/restfreq_hz, lambda x: x*restfreq_hz),
(lambdas, un.m, lambda x: x/restfreq_hz * co.c.to(un.m/un.s).value, lambda x: x/co.c.to(un.m/un.s).value * restfreq_hz),
(lambdas, un.ns, lambda x: x/restfreq_hz * 1e9, lambda x: x / 1e-9*restfreq_hz ),
(lambdas, klambdas, lambda x: x*1e-3, lambda x: x*1e3),
(klambdas, un.s, lambda x: 1e3*x/restfreq_hz, lambda x: 1e-3*x*restfreq_hz),
(klambdas, un.m, lambda x: 1e3*x/restfreq_hz * co.c.to(un.m/un.s).value, lambda x: 1e-3*x/co.c.to(un.m/un.s).value * restfreq_hz),
(klambdas, un.ns, lambda x: 1e3*x/restfreq_hz * 1e9, lambda x: 1e-3*x / 1e-9*restfreq_hz ),
(un.m, un.s, lambda x: x/co.c.to(un.m/un.s).value, lambda x: x*co.c.to(un.m/un.s).value),
(un.m, un.ns, lambda x: x/co.c.to(un.m/un.ns).value, lambda x: x*co.c.to(un.m/un.ns).value)
]
Итак, в качестве примера я могу сделать следующее:
In [10]: (100.*klambdas).to(un.m ,equivalencies=lambdas_equivalencies)
Out[10]: <Quantity 147.68101379310343 m>
In [13]: (12 * un.m).to(lambdas, equivalencies=lambdas_equivalencies)
Out[13]: <Quantity 8125.621359026984 lambdas>
In [29]: (1000000*un.ns).to(lambdas, equivalencies=lambdas_equivalencies)
Out[29]: <Quantity 203000000.0 lambdas>
Это предпочтительный / лучший способ сделать это, или я чего-то упускаю? Любые дополнительные настройки / советы приветствуются!
Дополнительные проблемы:
Я хочу включить это в объект. Итак, я определяю массив (атрибут объекта) с единицей измерения «кламбда». Затем я хочу иметь возможность преобразовать это на лету в «лямбда» или «м». Могу ли я сделать это, не переопределяя класс массива?