Manipulace s veličinami a jednotkami v knihovně Astropy

23. 4. 2024
Doba čtení: 24 minut

Sdílet

Autor: Root.cz s využitím DALL-E
Na předchozí dva články o manipulaci s veličinami a jednotkami dnes navážeme. Ukážeme si, jak je tato problematika řešena v rozsáhlé knihovně Astropy. Jde o sadu balíčků využitelných zejména v astronomii.

Obsah

1. Manipulace s veličinami a jednotkami v knihovně Astropy

2. Knihovna Astropy

3. Instalace knihovny Astropy

4. Manipulace s veličinami a jednotkami: od knihovny Pint ke knihovně Astropy

5. Specifikace jednotky u definované či vypočtené hodnoty

6. Atributy s hodnotou, jednotkou a datovým typem

7. Aritmetické operace s dvojicí hodnot se stejnou veličinou

8. Výpočet, jehož výsledkem je odlišná veličina

9. Výpočet zrychlení a síly

10. Zjištění, na které jednotky lze výsledek převést

11. Alternativy k odvozeným jednotkám

12. Převody mezi jednotkami

13. Kontroly prováděné při převodu jednotek

14. Hodnoty s jednotkami a typové informace

15. Deklarace datového typu

16. Explicitní zápis typových informací

17. Jednotky hodnot uložených v n-dimenzionálních polích

18. Příloha: základní (pod)balíčky dostupné po instalaci Astropy

19. Repositář s demonstračními příklady

20. Odkazy na Internetu

1. Manipulace s veličinami a jednotkami v knihovně Astropy

Na předchozí dva články Manipulace s jednotkami a veličinami: aby se nesčítaly hrušky s jablky a Kooperace mezi knihovnami Pint a SymPy při manipulaci s veličinami a jednotkami dnes navážeme. Ukážeme si totiž, jak je tato problematika řešena v rozsáhlé knihovně Astropy. Uvidíme, že základní myšlenka je sice prakticky totožná, ale možnosti poskytované knihovnou Astropy jsou kupodivu mnohem větší a taktéž jsou zaměřeny více prakticky.

Poznámka: knihovna Astropy je primárně určena pro potřeby astronomů, kteří (i když se striktně řečeno nejedná o jejich obor) v souvislosti s veličinami a jednotkami často odkazují na „slavnou chybu“, která ukončila misi Mars Climate Orbiter (stručně řečeno: jeden z modulů posílal informace v jednotkách, které druhý modul neočekával, což vedlo k odlišné trajektorii – modul měl brzdit v atmosféře Marsu, ovšem na vyšší orbitě).

2. Knihovna Astropy

Na projekt Astropy se sice můžeme dívat jako na jednu rozsáhlou knihovnu vytvořenou pro programovací jazyk Python, ve skutečnosti se však jedná o několik relativně samostatně využitelných balíčků, k nimž mohou být přidány další doplňující balíčky. Ovšem primární určení všech těchto balíčků je zřejmé – využívají se zejména v astronomii. Tento obor je tedy další oblastí, v níž se začal ve větší míře prosazovat programovací jazyk Python (ostatně už v roce 2012 byl tento jazyk preferován 42% dotázaných z oboru astronomie). Jak je v IT zvykem, díky této popularitě Pythonu začaly nekoordinovaně vznikat různé Pythonní balíčky řešící rozličné problémy z tohoto oboru. Projekt Astropy vznikl v roce 2011 a jeho hlavním cílem bylo sjednocení existující funkcionality do uceleného a dobře dokumentovaného balíčku, což se do značné míry podařilo (a je to jen dobře, protože se jedná o snadno nainstalovatelnou a použitelnou knihovnu).

Poznámka: mimochodem, právě požadavky astronomů na zpracování rozsáhlých polí vedly ke vzniku slavného projektu NumPy, protože předchůdce NumPy (projekt Numeric) nebyl pro tyto účely dostatečně výkonný a flexibilní.

Obrázek 1: Logo projektu Astropy.

3. Instalace knihovny Astropy

Instalaci knihovny Astropy lze realizovat různými způsoby. V komunitě se pro tento účel většinou používá Anaconda (opět odbočka: autorem Anacondy i NumPy je stejný vývojář Travis Oliphant), my ovšem pro účely dnešního článku zůstaneme u klasického pip. Na rozdíl od knihovny Pint, která neměla žádné závislosti, je tomu v případě Astropy jinak, což je ostatně patrné i ze zpráv vypisovaných v průběhu instalace:

$ pip3 install astropy

Instalace balíčků, na kterých Astropy přímo či tranzitivně závisí:

Defaulting to user installation because normal site-packages is not writeable
Collecting astropy
  Downloading astropy-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (10.3 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.3/10.3 MB 7.1 MB/s eta 0:00:00
Requirement already satisfied: numpy<2,>=1.22 in ./.local/lib/python3.11/site-packages (from astropy) (1.26.2)
Collecting pyerfa>=2.0.1.1
  Downloading pyerfa-2.0.1.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (738 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 738.7/738.7 kB 4.0 MB/s eta 0:00:00
Collecting astropy-iers-data>=0.2024.2.26.0.28.55
  Downloading astropy_iers_data-0.2024.4.15.2.45.49-py3-none-any.whl (1.9 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.9/1.9 MB 7.9 MB/s eta 0:00:00
Requirement already satisfied: PyYAML>=3.13 in /usr/lib64/python3.11/site-packages (from astropy) (6.0)
Requirement already satisfied: packaging>=19.0 in ./.local/lib/python3.11/site-packages (from astropy) (23.2)
Installing collected packages: pyerfa, astropy-iers-data, astropy
Successfully installed astropy-6.0.1 astropy-iers-data-0.2024.4.15.2.45.49 pyerfa-2.0.1.4

Po proběhnutí instalace zkontrolujeme závislosti:

$ pip show astropy

Po zadání výše uvedeného příkazu by se měly vypsat podrobnější informace o balíčku, a to včetně jeho závislostí. Ty jsou uvedeny na řádku Requires:

Name: astropy
Version: 6.0.1
Summary: Astronomy and astrophysics core library
Home-page:
Author:
Author-email: The Astropy Developers <astropy.team@gmail.com>
License: BSD-3-Clause
Location: /home/ptisnovs/.local/lib/python3.11/site-packages
Requires: astropy-iers-data, numpy, packaging, pyerfa, PyYAML
Required-by:

4. Manipulace s veličinami a jednotkami: od knihovny Pint ke knihovně Astropy

V navazujících kapitolách použijeme podobně koncipované demonstrační příklady, jaké jsme si ukázali při popisu knihovny Pint, takže bude snadné si porovnat shodné vlastnosti i rozdíly mezi oběma knihovnami (alespoň co se týče využívání veličin a jednotek). Nejprve si tedy ukážeme způsob specifikace jednotek, poté si řekneme, jak se jednotky mění při provádění výpočtů, provedeme převody mezi jednotkami atd.

5. Specifikace jednotky u definované či vypočtené hodnoty

V dnešním prvním demonstračním příkladu je ukázáno, jakým způsobem se zapíše hodnota 10 sekund, což je, jak již víme (ze základní školy), numerická hodnota doplněná o jednotku. Podobně jako tomu bylo v případě knihoven Pint a SymPy, i zde se spojení bezrozměrné hodnoty s jednotkou provádí přes (přetíženou) operaci součinu:

from astropy import units as u
 
t1 = 10 * u.second
 
print(t1)

Výsledkem výše zmíněného součinu je objekt obsahující hodnotu i jednotku, což je ostatně patrné i z výpisu obsahu (hodnoty) objektu funkcí print:

10.0 s

6. Atributy s hodnotou, jednotkou a datovým typem

Objekt s (fyzikální) hodnotou obsahuje trojici důležitých atributů, které se jmenují value, unit a dtype. První atribut obsahuje numerickou hodnotu, druhý atribut jednotku a třetí datový typ:

from astropy import units as u
 
t1 = 10 * u.second
 
print(t1.value)
print(t1.unit)
print(t1.dtype)

Z výsledků je patrné, že datový typ odpovídá konvencím knihovny NumPy, což by ovšem nemělo být příliš překvapivé, protože tato knihovna tvoří základ celého balíčku Astropy:

10.0
s
float64

7. Aritmetické operace s dvojicí hodnot se stejnou veličinou

V dalším demonstračním příkladu si ukážeme operaci, kterou jsme si již popisovali u knihovny Pint. Jedná se o operace s dvojicí časových údajů (tedy se stejnými veličinami, i když se jednotky mohou odlišovat). Na základě toho, jaká konkrétní aritmetická operace je provedena, bude výsledkem údaj s časovou jednotkou, s kvadrátem časové jednotky, s převrácenou časovou jednotkou nebo dokonce bezrozměrné číslo:

from astropy import units as u
 
t1 = 10 * u.second
t2 = 1 * u.minute
t3 = 1 * u.second
 
print(t1)
print(t2)
print(t1*t1)
print(1/t1)
print(t1+t2)
print(t1-t2)
print(t2/t1)
print(t1/t3)

A takto vypadají výsledky. Povšimněte si, jak se zapisuje s-1, s2 atd.:

10.0 s
1.0 min
100.0 s2
0.1 1 / s
70.0 s
-50.0 s
0.1 min / s
10.0
Poznámka: zajímavé je, že bezrozměrný výsledek je vypsán pouze v posledním případě a nikoli v případě předposledním. Ovšem po zjednodušení jednotky (viz další text) bude i výsledkem předposledního výpočtu bezrozměrné číslo.

Předchozí příklad si ještě rozšiřme tak, aby se explicitně vypsaly jednotky výsledků a nikoli hodnoty společně s jednotkami:

from astropy import units as u
 
t1 = 10 * u.second
t2 = 1 * u.minute
t3 = 1 * u.second
 
print(t1.unit)
print(t2.unit)
print((t1*t1).unit)
print((1/t1).unit)
print((t1+t2).unit)
print((t1-t2).unit)
print((t2/t1).unit)
print((t1/t3).unit)

Na první pohled to sice nemusí být patrné, ale poslední příkaz print vypsal pouze prázdný řádek, protože bezrozměrná hodnota nemá přiřazenou žádnou jednotku:

s
min
s2
1 / s
s
s
min / s
 

8. Výpočet, jehož výsledkem je odlišná veličina

Pokusme se nyní provést nějaký triviální výpočet, například výpočet rychlosti z ujeté vzdálenosti a času. Jedná se o výpočet, u kterého nás bude zajímat, jaká jednotka (veličina) bude přiřazena k vypočtenému výsledku:

from astropy import units as u
 
s = 100 * u.meter
t = 20 * u.second
 
print(s/t)

Výsledkem je v tomto případě podle očekávání rychlost pět metrů za sekundu:

5.0 m / s

Pro další rozšiřování si tento demonstrační příklad nepatrně upravíme tak, aby vypsal i veličinu, jejíž hodnotu vypisujeme:

from astropy import units as u
 
s = 100 * u.meter
t = 20 * u.second
v = s / t
 
print("v =", v)

Nyní je již výsledek konkrétnější a při výpisu většího množství výsledků i přehlednější:

v = 5.0 m / s

9. Výpočet zrychlení a síly

Nepatrnou úpravou vypočítáme kromě rychlosti i zrychlení, přičemž nás opět budou v první řadě zajímat jednotky výsledku, nikoli to, zda výpočet má přesný fyzikální význam (měli bychom totiž počítat buď derivaci, nebo změnu rychlosti za jednotku času, nikoli pouze dělit rychlost časem):

from astropy import units as u
 
s = 100 * u.meter
t = 20 * u.second
v = s / t
a = v / t
 
print("v =", v)
print("a =", a)

Z výsledků je patrné, že jsou korektní, a to jak z hlediska vypočtených hodnot, tak i jejich jednotek:

v = 5.0 m / s
a = 0.25 m / s2

Opět se nyní na chvíli vraťme ke knihovně Pint, kde jsme si na základě zrychlení a hmotnosti tělesa vypočítali sílu, která způsobila ono zrychlení. Opět se jedná o běžné výpočty, pouze s hodnotami, k nimž byly doplněny jednotky:

from astropy import units as u
 
s = 100 * u.meter
t = 20 * u.second
m = 100 * u.kilogram
v = s / t
a = v / t
f = m * a
 
print("v =", v)
print("a =", a)
print("f =", f)

Z výsledků plyne, že jednotky jsou opět korektní (a čistě náhodou používáme základní jednotky, to ovšem ve skutečnosti není nutné):

v = 5.0 m / s
a = 0.25 m / s2
f = 25.0 kg m / s2

10. Zjištění, na které jednotky lze výsledek převést

Velmi zajímavou a potenciálně užitečnou vlastností knihovny astropy.units je možnost zjištění, na jaké další jednotky je možné převést vybranou jednotku (ne ovšem hodnotu). Například si to můžeme ukázat u časové jednotky sekunda:

from astropy import units as u
 
t = u.second
 
for c in t.compose():
    print(c)

Možné převody sekundy na další časové jednotky vypadá takto:

s
3.16881e-08 a
3.16881e-08 yr
8.2672e-07 fortnight
1.65344e-06 wk
1.15741e-05 d
1.16058e-05 sday
0.000277778 h
0.0166667 min
Poznámka: opět novinka pro autora tohoto článku – fortnight je skutečně časová jednotka odpovídající čtrnácti dnům (nocím), neboli „fourteen nights“. Naše sprinty tedy trvají přesně jeden fortnight :-). Ostatně o převodu právě této jednotky se můžeme snadno přesvědčit:
from astropy import units as u
 
t = u.fortnight
 
for c in t.compose():
    print(c)

S výsledky:

fortnight
0.0383299 a
0.0383299 yr
2 wk
14 d
14.0383 sday
336 h
20160 min
1.2096e+06 s
Poznámka: wk znamená week.

11. Alternativy k odvozeným jednotkám

Zajímavější je situace u odvozených jednotek. Například se podívejme, jaké jsou alternativy k jednotce s-1:

from astropy import units as u
 
t = u.second ** -1
 
for c in t.compose():
    print(c)

Výsledky:

Bq
Hz
2.7027e-11 Ci
Poznámka: opravdu platí, že 1 Bq (Becquerel) = 1 s-1 = 27 pCi (pico Curie). Ovšem to, že se jedná o stejnou veličinu neznamená, že jsou jednotky zaměnitelné (tedy například nebudeme ladit stanici na rádiu v Becquerelech a naopak).

Pokračujme v pokusech dále; stále v oblasti časových jednotek a jednotek odvozených:

from astropy import units as u
 
t = u.second ** -2
 
for c in t.compose():
    print(c)

Výsledky:

Bq / s
Hz / s
1 / s2
2.7027e-11 Ci / s
100 Gal / m
2.75423e+22 AB / kg
1e+26 Jy / kg
3600 / min2
1.296e+07 / h2
7.42425e+09 / sday2
7.46496e+09 / d2
3.65783e+11 / wk2
1.46313e+12 / fortnight2
9.95882e+14 / a2
9.95882e+14 / yr2
100 % / s2

Podobným způsobem lze zjistit, že kg m / s odpovídá jednomu Netwonu:

from astropy import units as u
 
t = u.kilogram * u.meter / u.second ** 2
 
for c in t.compose():
    print(c)

Výsledky:

N
100000 dyn

12. Převody mezi jednotkami

Nyní již tedy můžeme velmi snadno zjistit, na kterou jednotku lze nějakou hodnotu převést. Samotný převod se provádí s využitím metody nazvané jednoduše to. Této metodě je nutné předat jednotku, na kterou se má převod provést. V praxi je převod triviální, jak je to ostatně patrné z následujícího demonstračního příkladu:

from astropy import units as u
 
f = 100 / u.second
 
print(f)
print(f.to(u.Hz))

Tento skript nejdříve vypíše hodnotu s původní jednotkou a poté výsledek převodu na kýženou jednotku:

100.0 1 / s
100.0 Hz

13. Kontroly prováděné při převodu jednotek

Samozřejmě se ovšem provádí kontroly, zda je zadaný převod jednotek korektní. Pokud se například pokusíme převést údaj o délce na Hertze (tj. na frekvenci), dojde po spuštění skriptu k vyhození výjimky:

from astropy import units as u
 
l = 100 * u.nm
 
print(l)
print(l.to(u.Hz))

A tímto způsobem knihovna astropy.units zareaguje na nekorektní převody jednotek (důležitý je poslední řádek, na němž je přesně napsáno, o jaký problém se jedná):

100.0 nm
Traceback (most recent call last):
  File "/home/ptisnovs/src/most-popular-python-libs/astropy/14_to.py", line 6, in <module>
    print(l.to(u.Hz))
          ^^^^^^^^^^
  File "/home/ptisnovs/.local/lib/python3.11/site-packages/astropy/units/quantity.py", line 943, in to
    value = self._to_value(unit, equivalencies)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ptisnovs/.local/lib/python3.11/site-packages/astropy/units/quantity.py", line 896, in _to_value
    return self.unit.to(
           ^^^^^^^^^^^^^
  File "/home/ptisnovs/.local/lib/python3.11/site-packages/astropy/units/core.py", line 1196, in to
    return self._get_converter(Unit(other), equivalencies)(value)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ptisnovs/.local/lib/python3.11/site-packages/astropy/units/core.py", line 1125, in _get_converter
    raise exc
  File "/home/ptisnovs/.local/lib/python3.11/site-packages/astropy/units/core.py", line 1108, in _get_converter
    return self._apply_equivalencies(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ptisnovs/.local/lib/python3.11/site-packages/astropy/units/core.py", line 1086, in _apply_equivalencies
    raise UnitConversionError(f"{unit_str} and {other_str} are not convertible")
astropy.units.core.UnitConversionError: 'nm' (length) and 'Hz' (frequency) are not convertible

Ve skutečnosti však mezi délkou a frekvencí existuje přímý vztah, a to konkrétně v souvislosti s vlnovou délkou. Zde se ovšem musí brát do úvahy (fázová) rychlost. Pro převod mezi vlnovou délkou a frekvencí elektromagnetického vlnění (fázová rychlost odpovídá rychlosti světla) můžeme použít nepovinný parametr equivalencies předaný metodě to:

from astropy import units as u
 
l = 100 * u.meter
 
print(l)
print(l.to(u.Hz, equivalencies=u.spectral()))

A takto vypadají vypočtené výsledky (druhá hodnota vám asi bude povědomá – numericky odpovídá rychlosti světla):

100.0 m
2997924.58 Hz

14. Hodnoty s jednotkami a typové informace

Při práci s hodnotami, k nimž jsou přiřazeny i jednotky, je mnohdy vhodné explicitně zadávat i typové informace. Podívejme se nejprve na příklad, ve kterém typové informace chybí. V příkladu je definována funkce pro výpočet rychlosti:

from astropy import units as u
 
def velocity(s, t):
    return s/t
 
s = 100 * u.meter
t = 20 * u.second
v = velocity(s, t)
 
print(v)

Vzhledem k tomu, že je tato funkce volána s korektními parametry, bude i výsledek výpočtu odpovídat očekávání:

5.0 m / s

Ovšem nic uživatelům nezabraňuje ve volání funkce velocity s otočením parametrů:

from astropy import units as u
 
def velocity(s, t):
    return s/t
 
s = 100 * u.meter
t = 20 * u.second
v = velocity(t, s)
 
print(v)

Výsledek v takovém případě pochopitelně nebude korektní, což je ostatně jasně patrné z výsledku zobrazeného po spuštění skriptu:

0.2 s / m

15. Deklarace datového typu

Knihovna Astropy ovšem umožňuje použít třídu nazvanou Quantity pro specifikaci datového typu. Podobně jako u dalších typových informací (typové nápovědy – type hints) se specifikace typu může zpřesnit zápisem jednotky do hranatých závorek. V následujícím příkladu jsou definovány tři proměnné, které obsahují přímo typy, konkrétně typy „délková jednotka metr“, „časová jednotka sekunda“ a „rychlost v metrech za sekundu“:

from astropy import units as u
 
length = u.Quantity[u.meter]
time = u.Quantity[u.second]
velocity = u.Quantity[u.meter/u.second]
 
print(length)
print(time)
print(velocity)

Po spuštění skriptu je z výpisu ihned zřejmé, že hodnotami jsou skutečně přímo typy představující fyzikální jednotky:

typing.Annotated[astropy.units.quantity.Quantity, Unit("m")]
typing.Annotated[astropy.units.quantity.Quantity, Unit("s")]
typing.Annotated[astropy.units.quantity.Quantity, Unit("m / s")]

Poměrně snadno můžeme nadeklarovat proměnnou s hodnotou a jednotkou přímo s využitím konstruktoru Quantity, což ovšem znamená, že se zápis odlišuje od zápisu v předchozím skriptu:

from astropy import units as u
 
length = u.Quantity(1, u.meter)
time = u.Quantity(2, u.second)
velocity = u.Quantity(1/5, u.meter/u.second)
 
print(length)
print(time)
print(velocity)

Výsledky:

1.0 m
2.0 s
0.2 m / s

16. Explicitní zápis typových informací

Nyní již máme k dispozici všechny potřebné znalosti nutné pro specifikaci informací o typech přímo v deklaraci funkce (parametry + návratové hodnoty). Tyto informace mohou využít integrovaná vývojová prostředí, popř. nástroje typu Pyright či Mypy pro kontrolu, zda je funkce volána s korektními argumenty:

from astropy import units as u
 
def velocity(s: u.Quantity[u.meter], t: u.Quantity[u.second]) -> u.Quantity[u.meter/u.second]:
    return s/t
 
s = 100 * u.meter
t = 20 * u.second
v = velocity(s, t)
 
print(v)

Chování skriptu v runtime se ovšem nezmění, protože interpretr programovacího jazyka Python informace o typech ignoruje:

5.0 m / s

17. Jednotky hodnot uložených v n-dimenzionálních polích

Vzhledem k tomu, že knihovna Astropy do značné míry závisí na známé a často využívané knihovně NumPy, nabízí se otázka, jak vlastně uložit hodnoty s jednotkami do n-rozměrných polí. Ve skutečnosti je to v praxi velmi snadné, protože pole s hodnotami bez jednotek můžeme vynásobit jednotkou (tedy vlastně skalárem). V takovém případě se realizuje takzvaný broadcast, tj. skalár se nejprve rozšíří na pole o stejném tvaru, jaký má druhý operand a teprve poté se provede zapsaná operace prvek po prvku.

To si samozřejmě můžeme snadno ukázat. Nejprve pole a s bezrozměrnými hodnotami převedeme na nové pole obsahující časové údaje. A poté podílem (prvek po prvku) s polem s délkami vypočteme rychlosti. Přitom pole s délkami obsahuje pouze jeden prvek, takže i zde se provede broadcast:

import numpy as np
from astropy import units as u
 
a = np.array(range(10)) + 1
print("a = ", a)
 
t = a * u.second
print("t = ", t)
 
l = np.array(1.0) * u.meter
print("l = ", l)
 
v = l / t
print("v = ", v)

Výsledkem by mělo být pole s deseti rychlostmi (poslední dva řádky výpisu):

a =  [ 1  2  3  4  5  6  7  8  9 10]
t =  [ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.] s
l =  1.0 m
v =  [1.         0.5        0.33333333 0.25       0.2        0.16666667
 0.14285714 0.125      0.11111111 0.1       ] m / s

A samozřejmě i zde platí, že některé operace mohou vést k výslednému poli obsahujícímu bezrozměrné hodnoty:

import numpy as np
from astropy import units as u
 
a = np.array(range(10)) + 1
print("a = ", a)
 
t = a * u.second
print("t = ", t)
 
d = t / t
print("d = ", d)

18. Příloha: základní (pod)balíčky dostupné po instalaci Astropy

Seznam všech standardních i doplňujících balíčků pro Astropy je dostupný na adrese https://www.astropy.org/af­filiated/index.html. V dnešním článku se ovšem budeme zabývat jediným balíčkem s názvem astropy.units. Ovšem po instalaci Astopy je snadné zjistit, které (pod)balíčky vlastně obsahuje:

table
stats
config
coordinates
wcs
visualization
nddata
samp
uncertainty
constants
io
cosmology
units
convolution
extern
modeling
time
utils
timeseries
tests

19. Repositář s demonstračními příklady

Zdrojové kódy všech prozatím popsaných demonstračních příkladů určených pro programovací jazyk Python 3 byly uloženy do Git repositáře dostupného na adrese https://github.com/tisnik/most-popular-python-libs.

Knihovna Pint

# Demonstrační příklad Stručný popis příkladu Cesta
1 01_time.py základní použití časových jednotek https://github.com/tisnik/most-popular-python-libs/blob/master/pint/01_time.py
2 02_dimensionality.py získání veličiny https://github.com/tisnik/most-popular-python-libs/blob/master/pint/02_di­mensionality.py
3 03_time.py operace s časovými jednotkami https://github.com/tisnik/most-popular-python-libs/blob/master/pint/03_time.py
4 04_time_dimensionality.py získání veličiny https://github.com/tisnik/most-popular-python-libs/blob/master/pint/04_ti­me_dimensionality.py
       
5 05_velocity.py rychlostní jednotky https://github.com/tisnik/most-popular-python-libs/blob/master/pint/05_velocity.py
6 06_velocity_dimensionality.py získání veličiny (nebo jejího přiblížení) https://github.com/tisnik/most-popular-python-libs/blob/master/pint/06_ve­locity_dimensionality.py
7 07_wrong_op.py detekce nekorektních operací https://github.com/tisnik/most-popular-python-libs/blob/master/pint/07_wrong_op.py
8 08_conversion.py konverze jednotek, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/pint/08_conversion.py
9 09_conversion.py konverze jednotek, druhý příklad https://github.com/tisnik/most-popular-python-libs/blob/master/pint/09_conversion.py
10 10_area.py výpočet plochy https://github.com/tisnik/most-popular-python-libs/blob/master/pint/10_area.py
11 11_velocity.py výpočet rychlosti https://github.com/tisnik/most-popular-python-libs/blob/master/pint/11_velocity.py
12 12_acceleration.py výpočet zrychlení https://github.com/tisnik/most-popular-python-libs/blob/master/pint/12_ac­celeration.py
13 13_force.py výpočet síly https://github.com/tisnik/most-popular-python-libs/blob/master/pint/13_force.py
14 14_units_and_dimensionality.py veličiny a jednotky https://github.com/tisnik/most-popular-python-libs/blob/master/pint/14_u­nits_and_dimensionality.py
15 15_prefixes.py použití prefixů u jednotek, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/pint/15_prefixes.py
16 16_prefixes.py použití prefixů u jednotek, druhý příklad https://github.com/tisnik/most-popular-python-libs/blob/master/pint/16_prefixes.py
17 17_prefixes.py použití prefixů u jednotek, třetí příklad https://github.com/tisnik/most-popular-python-libs/blob/master/pint/17_prefixes.py
18 18_binary_prefixes.py binární prefixy https://github.com/tisnik/most-popular-python-libs/blob/master/pint/18_bi­nary_prefixes.py
19 19_byte_to_bites.py binární prefixy a převod bajtů na bity https://github.com/tisnik/most-popular-python-libs/blob/master/pint/19_by­te_to_bites.py
20 20_angle.py úhlové jednotky https://github.com/tisnik/most-popular-python-libs/blob/master/pint/20_angle.py
       
21 21_list_units.py výpis všech dostupných jednotek https://github.com/tisnik/most-popular-python-libs/blob/master/pint/21_list_units.py
       
22 22_reduced_units.py redukce dimensionality https://github.com/tisnik/most-popular-python-libs/blob/master/pint/22_re­duced_units.py
23 23_to_base_units.py redukce na základní jednotky https://github.com/tisnik/most-popular-python-libs/blob/master/pint/23_to_ba­se_units.py
24 24_to_base_units.py redukce na základní jednotky https://github.com/tisnik/most-popular-python-libs/blob/master/pint/24_to_ba­se_units.py
25 25_formatting.py formátovaný výstup https://github.com/tisnik/most-popular-python-libs/blob/master/pint/25_formatting.py
       
26 26_energy.py výpočet energie s jednotkami https://github.com/tisnik/most-popular-python-libs/blob/master/pint/26_energy.py
27 27_energy_base_units.py výpočet energie s jednotkami, převod na základní jednotky https://github.com/tisnik/most-popular-python-libs/blob/master/pint/26_e­nergy_base_units.py
       
28 28_parsing.py parsing vstupních řetězců v knihovně Piny, příklad číslo 1 (vzdálenost) https://github.com/tisnik/most-popular-python-libs/blob/master/pint/28_parsing.py
29 29_parsing.py parsing vstupních řetězců v knihovně Piny, příklad číslo 2 (síla) https://github.com/tisnik/most-popular-python-libs/blob/master/pint/29_parsing.py
30 30_parsing.py parsing vstupních řetězců v knihovně Piny, příklad číslo 3 (údaje o délkách) https://github.com/tisnik/most-popular-python-libs/blob/master/pint/30_parsing.py
31 31_parsing.py parsing vstupních řetězců v knihovně Piny, příklad číslo 4 (údaje o délkách) https://github.com/tisnik/most-popular-python-libs/blob/master/pint/31_parsing.py
32 32_parsing.py parsing vstupních řetězců v knihovně Piny, příklad číslo 5 (časové údaje) https://github.com/tisnik/most-popular-python-libs/blob/master/pint/32_parsing.py
33 33_parsing.py parsing vstupních řetězců v knihovně Piny, příklad číslo 6 (časové údaje) https://github.com/tisnik/most-popular-python-libs/blob/master/pint/33_parsing.py

Knihovna SymPy kombinovaná s knihovnou Pint

# Demonstrační příklad Stručný popis příkladu Cesta
       
1 01_symbol.py použití symbolů v knihovně Sympy https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/01_symbol.py
2 02_symbol_and_unit.py kombinace symbolů a jednotek, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/02_symbol_and_unit.py
3 03_symbol_and_unit.py kombinace symbolů a jednotek, druhý příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/03_symbol_and_unit.py
4 04_velocity.py výpočet rychlosti s využitím jednotek https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/04_velocity.py
5 05_force.py výpočet síly s využitím jednotek https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/05_force.py
6 06_better_output.py tisk hodnoty i jednotek https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/06_better_output.py
       
7 07_symbolic_computation.py symbolické výpočty v knihovně Sympy, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/07_symbolic_computation.py
8 08_symbolic_computation.py symbolické výpočty v knihovně Sympy, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/08_symbolic_computation.py
9 09_solve.py symbolické řešení rovnice https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/09_solve.py
       
10 10_sympy_units.py jednotky přímo z knihovny Sympy https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/10_sympy_units.py
11 11_diff.py symbolický výpočet derivace s využitím jednotek https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/11_diff.py
12 12_solve.py symbolické řešení rovnice s využitím jednotek, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/12_solve.py
13 13_solve.py symbolické řešení rovnice s využitím jednotek, druhý příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/13_solve.py
14 14_solve.py symbolické řešení nerovnice s využitím jednotek, první příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/14_solve.py
15 15_solve.py symbolické řešení nerovnice s využitím jednotek, druhý příklad https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/15_solve.py
16 16_wrong_units.py použití nekompatibilních jednotek https://github.com/tisnik/most-popular-python-libs/blob/master/sympy-pint/16_wrong_units.py

Knihovna Astropy

# Demonstrační příklad Stručný popis příkladu Cesta
1 01_time.py specifikace jednotky u definované či vypočtené hodnoty https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/01_time.py
2 02_units.py získání hodnoty, jednotky a typu hodnoty https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/02_units.py
3 03_time.py aritmetické operace s dvojicí hodnot se stejnou veličinou https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/03_time.py
       
4 04_units.py výpočet, jehož výsledkem je odlišná veličina https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/04_units.py
5 05_velocity.py výpočet rychlosti, nejjednodušší varianta https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/05_ve­locity.py
6 06_velocity.py výpočet rychlosti, nepatrně vylepšená varianta https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/06_ve­locity.py
7 07_acceleration.py výpočet zrychlení https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/07_ac­celeration.py
8 08_force.py výpočet síly působící na urychlované těleso https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/08_force.py
       
9 09_compose.py zjištění, na které jednotky lze výsledek převést (časové jednotky) https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/09_compose.py
10 10_compose.py zjištění, na které jednotky lze výsledek převést (časové jednotky) https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/10_compose.py
11 11_compose.py zjištění alternativ k odvozeným jednotkám https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/11_compose.py
12 12_compose.py zjištění alternativ k odvozeným jednotkám https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/12_compose.py
       
13 13_to.py převody mezi jednotkami (korektní varianta) https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/13_to.py
14 14_to.py převody mezi jednotkami (nekorektní varianta) https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/14_to.py
15 15_to.py převod mezi frekvencí a vlnovou délkou https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/15_to.py
       
16 16_no_types.py funkce bez uvedení typových informací https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/16_no_ty­pes.py
17 17_wrong_types.py volání funkce s nekorektními argumenty https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/17_wron­g_types.py
18 18_quantity_types.py specifikace typů hodnot s jednotkami https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/18_qu­antity_types.py
19 19_quantity_types.py specifikace typů hodnot s jednotkami https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/19_qu­antity_types.py
20 20_type_hints.py typové informace v deklaraci funkce https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/20_ty­pe_hints.py
       
21 21_numpy_units.py jednotky hodnot uložených v n-rozměrných polích https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/21_num­py_units.py
22 22_numpy_units.py jednotky hodnot uložených v n-rozměrných polích https://github.com/tisnik/most-popular-python-libs/blob/master/astropy/22_num­py_units.py

20. Odkazy na Internetu

  1. Unit-aware arithmetic in Xarray, via pint
    https://xarray.dev/blog/introducing-pint-xarray
  2. Xarray: sémantické rozšíření n-rozměrných polí z knihovny NumPy
    https://www.root.cz/clanky/xarray-semanticke-rozsireni-n-rozmernych-poli-z-knihovny-numpy/
  3. Xarray: sémantické rozšíření n-rozměrných polí z knihovny NumPy (dokončení)
    https://www.root.cz/clanky/xarray-semanticke-rozsireni-n-rozmernych-poli-z-knihovny-numpy-dokonceni/
  4. Stránky projektu Astropy
    https://www.astropy.org/
  5. Astropy na Wikipedii
    https://en.wikipedia.org/wiki/Astropy
  6. Astropy na GitHubu
    https://github.com/astropy/astropy
  7. Astropy: Getting started
    https://docs.astropy.org/en/sta­ble/index_getting_started­.html
  8. Units and Quantities
    https://uomresearchit.git­hub.io/programming_with_pyt­hon/06-units_and_quantities/index.html
  9. Mars Climate Orbiter
    https://en.wikipedia.org/wi­ki/Mars_Climate_Orbiter
  10. Derivative Calculator
    https://www.derivative-calculator.net/
  11. Fyzikální veličina (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Fyzik%C3%A1ln%C3%AD_ve­li%C4%8Dina
  12. Fyzikální jednotka (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Fyzik%C3%A1ln%C3%AD_jed­notka
  13. Soustava SI (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Soustava_SI
  14. Dokumentace ke knihovně Pint
    https://pint.readthedocs.i­o/en/stable/index.html
  15. Knihovna astropy na PyPi
    https://pypi.org/project/astropy/
  16. Knihovna Pint na PyPi
    https://pypi.org/project/Pint/
  17. Repositář knihovny Pint
    https://github.com/hgrecco/pint
  18. Knihovna units na PyPi (nevyvíjený projekt)
    https://pypi.org/project/units/
  19. Knihovna quantity na PyPi
    https://pypi.org/project/quantity/
  20. Repositář s knihovnou quantity
    https://github.com/mamrhein/quantity
  21. SymPy
    https://www.sympy.org/en/index.html
  22. SymPy na PyPi
    https://pypi.org/project/sympy/
  23. mpmath
    https://mpmath.org/
  24. mpmath na PyPi
    https://pypi.org/project/mpmath/
  25. Symbolic Maths in Python
    https://alexandrugris.git­hub.io/maths/2017/04/30/sym­bolic-maths-python.html
  26. SymPy shell
    https://live.sympy.org/
  27. Symbolic programming
    https://en.wikipedia.org/wi­ki/Symbolic_programming
  28. Symbolic language (programming)
    https://en.wikipedia.org/wi­ki/Symbolic_language_(pro­gramming)
  29. Computer algebra
    https://en.wikipedia.org/wi­ki/Computer_algebra
  30. Knihovna xarray-units na PyPi
    https://pypi.org/project/xarray-units/
  31. Kawa: překvapivě silný a výkonný dialekt Scheme pro JVM
    https://www.root.cz/clanky/kawa-prekvapive-silny-a-vykonny-dialekt-scheme-pro-jvm/
  32. Jazyk Kawa v ekosystému virtuálního stroje Javy
    https://www.root.cz/clanky/jazyk-kawa-v-ekosystemu-virtualniho-stroje-javy/
  33. Zpracování vektorů, matic a N-rozměrných polí v programovacím jazyku Kawa
    https://www.root.cz/clanky/zpracovani-vektoru-matic-a-n-rozmernych-poli-v-programovacim-jazyku-kawa/
  34. Kawa: Compiling Scheme to Java
    https://www.mit.edu/afs.new/sip­b/project/kawa/doc/kawa-tour.html
  35. Kawa in Languages shootout
    http://per.bothner.com/blog/2010/Kawa-in-shootout/
  36. Kawa 2.0 Supports Scheme R7RS
    https://developers.slashdot­.org/story/14/12/13/2259225/ka­wa-20-supports-scheme-r7rs/
  37. Kawa — fast scripting on the Java platform
    https://lwn.net/Articles/623349/
Neutrální ikona do widgetu na odběr článků ze seriálů

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.


Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.