Lekce 2 - NumPy - Datové typy
V předchozí lekci, NumPy - Představení knihovny, jsme se dověděli základní informace o knihovně NumPy. Naučili jsme se, jak knihovnu přidat do svého Python prostředí a nainstalovali si Jupyter Notebook.
V tomto tutoriálu knihovny NumPy v Pythonu se nejprve podíváme na to, jaké nové datové typy knihovna do Pythonu přináší. Dále si vysvětlíme, k čemu se nám budou hodit a jak je používat.
Nativní datové typy v Pythonu
Ještě než se pustíme do datových typů v NumPy, připomeňme si, jaké defaultní datové typy Python má:
string- řetězec znaků,integer- celé číslo,float- číslo s desetinnou čárkou,complex- komplexní číslo,bool- logická hodnota.
Jak zjistit datový typ proměnné?
V Pythonu je zabudovaná funkce type(). Ta nám může pomoct
získat přehled o tom, s jakým typem proměnné zrovna pracujeme:
print(type("Hello World!")) print(type(123)) print(type(3.141592)) print(type(complex(2,1))) print(type(True))
Ve výstupu do konzole dostaneme:
Zjištění typu proměnné:
<class 'str'>
<class 'int'>
<class 'float'>
<class 'complex'>
<class 'bool'>
Pokud chceme v prostředí Jupyter Notebooku vypsat pouze jednu
proměnnou, nemusíme ji psát do funkce print(). Stačí ji jen
volně nechat na konci bloku kódu. Tuto techniku ale není možné použít
při programování v jiných IDE, v konzoli ani při skriptování!
Datové typy v NumPy
Konečně se dostáváme k datovým typům z knihovny NumPy. Knihovna používá vlastní datové typy založené na programovacím jazyku C. Díky tomu jsou operace NumPy rychlejší než je v Pythonu běžné.
Pozor, teď neřešíme objekty typu NumPy
array, ale to, co do nich budeme vkládat.
Pro vytváření proměnných daných typů v ukázkách níže musíme mít
importovaný numpy pod aliasem np:
import numpy as np
Zkratka np se pro NumPy používá v praxi
běžně. Klidně bychom ale mohli as np vynechat a v ukázkách
kódu používat slovo numpy. Funguje to stejně.
Opět si nejprve uděláme přehled datových typů, tentokrát i se zkratkami, pod nimiž NumPy dané typy používá:
U-unicode string(řetězec unicode znaků),i-integer(celé číslo),u-unsigned integer(nezáporné celé číslo),f-float(číslo s desetinnou čárkou),c-complex(komplexní číslo),b-boolean(logická proměnná),M-datetime(datum a čas).
Nejedná se o celý výčet, ale o výběr těch, se kterými se nejčastěji setkáme. NumPy používá tyto znaky, abychom mohli snadno zjistit, o jaký typ se jedná a zároveň, aby se typy nepletly s běžnými nativními typy Pythonu.
NumPy typy dávají smysl hlavně uvnitř polí
(ndarray) a při numericky náročných výpočtech, kde je
důležitá rychlost, paměťová úspornost a přesná kontrola nad
dtype.
Jednotlivé datové typy NumPy
Pojďme se podívat na jednotlivé datové typy konkrétně.
U -
unicode string (řetězec unicode znaků)
Tento NumPy datový typ je ekvivalentní typu str v Pythonu s
pevně určenou délkou.
Vytvoříme ho takto:
s = np.str_("Hello World!")
Stejně jako string v Pythonu, i typ U
má nejrůznější metody, které se na něj dají použít. Velkou část z
nich je možné najít v modulu np.char.
i - integer (celé
číslo)
Typ i je ekvivalentní typu int v Pythonu. V
určitých případech se nám bude hodit, že jej lze definovat také jako
int32, int64.
Pro vytvoření proměnné tohoto typu použijeme následující kód:
muj_int32 = np.int32(64) # Čísla v argumentu jsou dána jen jako příklad. muj_int64 = np.int64(1325) # Ve skutečnosti mohou být libovolná.
Pokud chceme, aby se počet bitů zvolil automaticky, napíšeme místo
počtu bitů podtržítko _:
muj_int = np.int_(42)
u -
unsigned integer (nezáporné celé číslo)
Tento typ využijeme jen výjimečně. Oproti běžnému typu
int totiž neumožňuje používat záporné hodnoty. Hodí se
například při optimalizaci paměti, pokud pracujeme s velmi velkými
nezápornými čísly a víme, že se nikdy nedostaneme do záporných
hodnot.
Stejně jako u typu int můžeme zvolit přesnou velikost podle
počtu bitů. K dispozici jsou například uint8,
uint16, uint32 nebo uint64:
muj_uint32 = np.uint32(23) muj_uint64 = np.uint64(23)
f - float
(číslo s desetinnou čárkou)
Typ f je ekvivalent datového typu float v Pythonu.
Pokud chceme přesně určit velikost čísla v bitech, můžeme použít
konkrétní datové typy jako float16, float32 nebo
float64.
muj_float32 = np.float32(1.414)
Pokud nepotřebujeme řešit velikost čísla, použijeme přímo vestavěný Python typ:
muj_float = float(1.414)
c - complex
(komplexní číslo)
NumPy nabízí komplexní datové typy s přesně určenou velikostí — podle počtu bitů pro reálnou a imaginární část. Konstruktor může přijmout dvě čísla, tedy reálnou a imaginární část zvlášť nebo jedno komplexní číslo zapsané jako literál:
muj_complex128 = np.complex128(2, 3) muj_complex64 = np.complex64(2 + 3j)
b - boolean
(logická proměnná)
Boolean hodnoty můžeme vytvářet přímo pomocí vestavěného Python typu
bool:
muj_bool = bool(True)
Pokud potřebujeme přímo NumPy datový typ (např. pro použití v polích
nebo při definování dtype), použijeme
np.bool_:
muj_bool = np.bool_(True)
M -
np.datetime64 (datum a čas)
Pro uložení času do proměnné slouží typ np.datetime64.
Způsob vytvoření této proměnné je opět jednoduchý. Čas se zadává ve
formátu RRRR-MM-DDTHH:MM:SS, kde:
RRRRje rok,MMje měsíc,DDje den,HHjsou hodiny,MMjsou minuty,SSjsou vteřiny.
Znak T píšeme jako rozdělení data a času.
Do vteřin je možné dát za desetinnou čárku i přesnější vyjádření. Navíc nám typ dovoluje napsat jen datum. Také nemusíme například uvést vteřiny. Pojďme si ukázat několik příkladů:
# 20. července 2023, 17h 23min 10.42s muj_datetime1 = np.datetime64('2023-07-20T17:23:10.42') # 20. července 2023 muj_datetime2 = np.datetime64('2023-07-20') # funguje i bez dnů muj_datetime3 = np.datetime64('2023-07')
Jak zjistit typ obsažený v NumPy objektu
Na závěr si pojďme ukázat, jak zjistíme konkrétní typ u NumPy
objektů. Slouží pro to atribut dtype:
muj_int32 = np.int32(64) print(muj_int32.dtype) # int32 muj_int64 = np.int64(1325) print(muj_int64.dtype) # int64 muj_uint64 = np.uint64(23) print(muj_uint64.dtype) # uint64 muj_float32 = np.float32(1.414) print(muj_float32.dtype) # float32 muj_float64 = np.float64(3.141592) print(muj_float64.dtype) # float64 muj_complex = np.complex128(2 + 3j) print(muj_complex.dtype) # complex128 muj_bool = np.bool_(True) print(muj_bool.dtype) # bool muj_datetime = np.datetime64('2023-07-20T17:23:10.42') print(muj_datetime.dtype) # datetime64[ms]
Ve výstupu uvidíme:
Typy proměnných:
int32
int64
uint64
float32
float64
complex128
bool
datetime64[ms]
Princip funguje i pro NumPy pole.
To je k základním datovým typům NumPy vše.
V následující lekci, NumPy - Tvorba polí, si ukážeme, jak vytvořit pole knihovny
NumPy ndarray pomocí již známých seznamů Pythonu i pomocí
metod, které nabízí sama knihovna NumPy.
