Lekce 2 - Datové typy
V předchozí lekci, 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 stručně, jaké datové typy má Python defaultně. Ve zkratce je jich těchto pět:
string
- řetězec znakůinteger
- celé číslofloat
- číslo s desetinou čárkoucomplex
- komplexní číslobool
- 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 konzole dostaneme:
Zjištění typu proměnné:
class 'str'
class 'int'
class 'float'
class 'complex'
class 'bool'
Pokud chceme vypsat v prostředí Jupyter Notebooku pouze jednu
proměnnou, nemusíme 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.
Celý výčet včetně konstrukcí se není potřeba učit nazpaměť! Jde spíš o orientaci. A při inicializaci polí se vytvoří ten správný typ automaticky
Jednotlivé datové typy NumPy
Pojďme se podívat na jednotlivé datové typy konkrétně.
U
-
unicode string
(řetězec unicode znaků)
Tento datový typ je ekvivalentní typu string
v Pythonu.
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 integer
v Pythonu. V
určitých případech se nám bude hodit, že jej lze definovat také jako
int32
, int64
a dokonce můžeme použít i libovolnou
další mocninu dvojky od 8
do 256
. Standardně se
používá int32
, ale pro velmi velká čísla je potřeba použít
jeho násobnou verzi. Pak sice v paměti počítače zabere místo 32 bitů
rovnou 64 (respektive 128, či 256), ale někdy není zbytí.
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 spíše ve vzácných případech. Oproti typu
integer
totiž unsigned integer
neumožňuje jít pod
nulu. Využijeme jej například pokud optimalizujeme množství využité
paměti během běhu programu a přitom pracujeme s velmi vysokými
nezápornými čísly.
Stejně jako integer
, i typ u
je možné použít
ve variantě s větším rozsahem bitů. Pokud použijeme konstruktor bez
čísla, počet bitů se zvolí automaticky. Oproti konstruktoru typu
integer
(viz předchozí sekce) se ale nepíše podtržítko za
názvem:
muj_uint = np.uint(23)
f
- float
(číslo s desetinnou čárkou)
Typ f
je ekvivalent datového typu float
v Pythonu.
Opět lze zvolit počet bitů při vytváření proměnné. Nebo použít
konstruktor s podtržítkem, jako v případě typu i
.
muj_float = np.float_(1.414)
U typu float
se v praxi často stává, že nám záleží na co
nejdelší části za desetinou čárkou bez zaokrouhlení. Proto se pro
"dvojnásobný float" (tedy vlastně float32
) zavedl typ
double
. I takto je možné float
v NumPy
inicializovat:
muj_double = np.double(3.141592)
c
- complex
(komplexní číslo)
Komplexní čísla se vytvoří jednoduše z komplexních čísel, jak je známe v Pythonu:
muj_complex = np.complex_(complex(2, 3))
b
- boolean
(logická proměnná)
Podobně jako předchozí typy, i boolean
se vytváří a
funguje podobně, jako ho běžně známe v Pythonu:
muj_bool = np.bool_(True)
Podtržítko za klíčovým slovem bool
není u
tohoto typu povinné. Zápisy np.bool_(True)
a
np.bool(True)
jsou tak ekvivalentní. Většina programátorů
však volí zkrácenou variantu np.bool(True)
, protože je kratší
a čitelnější.
M
- datetime
(datum a
čas)
Pro uložení času do proměnné slouží typ datetime
. 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 a DD
je den. Znak T
se napíše prostě
jako rozdělení data a času. HH
je hodina, druhé MM
je minuta a SS
jsou vteřiny. 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 či jen čas, pokud chceme. Také můžeme neuvést např. 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 ještě ukázat, jak zjistíme konkrétní typ u NumPy
objektů. Slouží pro to atribut dtype
a je to velmi jednoduché.
Princip funguje i pro NumPy pole.
Ukažme si příklady pro jednotlivé typy proměnných:
muj_int32 = np.int32(64) print(muj_int32.dtype) # int32 muj_int64 = np.int64(1325) print(muj_int64.dtype) # int64 muj_uint = np.uint(23) print(muj_uint.dtype) # uint64 muj_float = np.float32(1.414) print(muj_float.dtype) # float32 muj_double = np.double(3.141592) print(muj_double.dtype) # float64 muj_complex = np.complex_(complex(2, 3)) 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
uint32
float32
float64
complex128
bool
datetime64[ms]
To je k základním datovým typům NumPy vše.
V následující lekci, Tvorba polí, si ukážeme, jak vytvořit pole knihovny
NumPy ndarray
. Ukážeme si, jak to provést pomocí již známých
seznamů Pythonu i pomocí metod, které nabízí sama knihovna NumPy.