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é datové defaultní datové typy Python má:
string
- řetězec znaků,integer
- celé číslo,float
- číslo s desetinou čá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.
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 v paměti počítače zabere místo 32 bitů rovnou 64
(respektive 128, či 256).
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 vzácně. 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í kapitola) 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 můžeme takto
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,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 či jen čas. 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_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.complex128(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]
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.