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:
RRRR
je rok,MM
je měsíc,DD
je den,HH
jsou hodiny,MM
jsou minuty,SS
jsou 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.