2. diel - NumPy - Dátové typy
V predchádzajúcej lekcii, NumPy - Predstavenie knižnice, sme sa dozvedeli základné informácie o knižnici NumPy. Naučili sme sa, ako knižnicu pridať do svojho Python prostredia a nainštalovali si Jupyter Notebook.
V tomto tutoriáli knižnice NumPy v Pythone sa najskôr pozrieme na to, aké nové dátové typy knižnica do Pythonu prináša. Ďalej si vysvetlíme, na čo sa nám budú hodiť a ako ich používať.
Natívne dátové typy v Pythone
Ešte než sa pustíme do dátových typov v NumPy, pripomeňme si, aké defaultné dátové typy Python má:
string– reťazec znakov,integer– celé číslo,float– číslo s desatinnou čiarkou,complex– komplexné číslo,bool– logická hodnota.
Ako zistiť dátový typ premennej?
V Pythone je zabudovaná funkcia type(). Tá nám môže
pomôcť získať prehľad o tom, s akým typom premennej práve pracujeme:
print(type("Hello World!")) print(type(123)) print(type(3.141592)) print(type(complex(2,1))) print(type(True))
Vo výstupe do konzoly dostaneme:
The determination of the variable type
<class 'str'>
<class 'int'>
<class 'float'>
<class 'complex'>
<class 'bool'>
Ak chceme v prostredí Jupyter Notebooku vypísať iba jednu
premennú, nemusíme ju písať do funkcie print(). Stačí ju len
voľne nechať na konci bloku kódu. Túto techniku ale nie je možné použiť
pri programovaní v iných IDE, v konzole ani pri skriptovaní!
Dátové typy v NumPy
Konečne sa dostávame k dátovým typom z knižnice NumPy. Knižnica používa vlastné dátové typy založené na programovacom jazyku C. Vďaka tomu sú operácie NumPy rýchlejšie ako je v Pythone bežné.
Pozor, teraz neriešime objekty typu NumPy
array, ale to, čo do nich budeme vkladať.
Na vytváranie premenných daných typov v ukážkach nižšie musíme mať
importované numpy pod aliasom np:
import numpy as np
Skratka np sa pre NumPy používa v praxi bežne.
Pokojne by sme ale mohli as np vynechať a v ukážkach kódu
používať slovo numpy. Funguje to rovnako.
Opäť si najskôr urobíme prehľad dátových typov, tentoraz aj so skratkami, pod ktorými NumPy dané typy používa:
U–unicode string(reťazec unicode znakov),i–integer(celé číslo),u–unsigned integer(nezáporné celé číslo),f–float(číslo s desatinnou čiarkou),c–complex(komplexné číslo),b–boolean(logická premenná),M–datetime(dátum a čas).
Nejedná sa o celý zoznam, ale o výber tých, s ktorými sa najčastejšie stretneme. NumPy používa tieto znaky, aby sme mohli ľahko zistiť, o aký typ ide a zároveň, aby sa typy neplietli s bežnými natívnymi typmi Pythonu.
NumPy typy dávajú zmysel najmä vo vnútri polí
(ndarray) a pri numericky náročných výpočtoch, kde je
dôležitá rýchlosť, pamäťová úspornosť a presná kontrola nad
dtype.
Jednotlivé dátové typy NumPy
Poďme sa pozrieť na jednotlivé dátové typy konkrétne.
U -
unicode string (reťazec unicode znakov)
Tento NumPy dátový typ je ekvivalentný typu str v Pythone s
pevne určenou dĺžkou.
Vytvoríme ho takto:
s = np.str_("Hello World!")
Rovnako ako string v Pythone, aj typ U
má najrôznejšie metódy, ktoré sa naň dajú použiť. Veľkú časť z nich
je možné nájsť v module np.char.
i - integer (celé
číslo)
Typ i je ekvivalentný typu int v Pythone. V
určitých prípadoch sa nám bude hodiť, že ho možno definovať aj ako
int32, int64.
Na vytvorenie premennej tohto typu použijeme nasledujúci kód:
my_int32 = np.int32(64) # The numbers in the argument are given only as an example. my_int64 = np.int64(1325) # In reality, they can be arbitrary.
Ak chceme, aby sa počet bitov zvolil automaticky, napíšeme namiesto počtu
bitov podčiarknutie _:
my_int = np.int_(42)
u -
unsigned integer (nezáporné celé číslo)
Tento typ využijeme len výnimočne. Oproti bežnému typu int
totiž neumožňuje používať záporné hodnoty. Hodí sa napríklad pri
optimalizácii pamäte, ak pracujeme s veľmi veľkými nezápornými číslami
a vieme, že sa nikdy nedostaneme do záporných hodnôt.
Rovnako ako pri type int môžeme zvoliť presnú veľkosť podľa počtu
bitov. K dispozícii sú napríklad uint8, uint16,
uint32 alebo uint64:
my_uint32 = np.uint32(23) my_uint64 = np.uint64(23)
f - float
(číslo s desatinnou čiarkou)
Typ f je ekvivalent dátového typu float v
Pythone. Ak chceme presne určiť veľkosť čísla v bitoch, môžeme použiť
konkrétne dátové typy ako float16, float32 alebo
float64.
my_float32 = np.float32(1.414)
Ak nepotrebujeme riešiť veľkosť čísla, použijeme priamo vstavaný Python typ:
my_float = float(1.414)
c - complex
(komplexné číslo)
NumPy ponúka komplexné dátové typy s presne určenou veľkosťou - podľa počtu bitov pre reálnu a imaginárnu časť. Konštruktor môže prijať dve čísla, teda reálnu a imaginárnu časť zvlášť alebo jedno komplexné číslo zapísané ako literál:
my_complex128 = np.complex128(2, 3) my_complex64 = np.complex64(2 + 3j)
b - boolean
(logická premenná)
Boolean hodnoty môžeme vytvárať priamo pomocou vstavaného Python typu
bool:
my_bool = bool(True)
Ak potrebujeme priamo NumPy dátový typ (napr. pre použitie v poliach alebo
pri definovaní dtype), použijeme np.bool_:
muj_bool = np.bool_(True)
M -
np.datetime64 (dátum a čas)
Na uloženie času do premennej slúži typ np.datetime64.
Spôsob vytvorenia tejto premennej je opäť jednoduchý. Čas sa zadáva vo
formáte RRRR-MM-DDTHH:MM:SS, kde:
RRRRje rok,MMje mesiac,DDje deň,HHsú hodiny,MMsú minúty,SSsú sekundy.
Znak T píšeme ako rozdelenie dátumu a času.
Do sekúnd je možné dať za desatinnú čiarku aj presnejšie vyjadrenie. Navyše nám typ dovoľuje napísať len dátum. Tiež nemusíme napríklad uviesť sekundy. Poďme si ukázať niekoľko príkladov:
# July 20, 2023, 17h 23min 10.42s my_datetime1 = np.datetime64('2023-07-20T17:23:10.42') # July 20, 2023 my_datetime2 = np.datetime64('2023-07-20') # It works even without days. my_datetime3 = np.datetime64('2023-07')
Ako zistiť typ obsiahnutý v NumPy objekte
Na záver si poďme ukázať, ako zistíme konkrétny typ u NumPy
objektov. Slúži na to atribút dtype:
my_int32 = np.int32(64) print(my_int32.dtype) # int32 my_int64 = np.int64(1325) print(my_int64.dtype) # int64 my_uint64 = np.uint64(23) print(my_uint64.dtype) # uint64 my_float32 = np.float32(1.414) print(my_float32.dtype) # float32 my_float64 = np.float64(3.141592) print(my_float64.dtype) # float64 my_complex = np.complex128(2 + 3j) print(my_complex.dtype) # complex128 my_bool = np.bool_(True) print(my_bool.dtype) # bool my_datetime = np.datetime64('2023-07-20T17:23:10.42') print(my_datetime.dtype) # datetime64[ms]
Vo výstupe uvidíme:
Variable types
int32
int64
uint64
float32
float64
complex128
bool
datetime64[ms]
Princíp funguje aj pre NumPy poľa.
To je k základným dátovým typom NumPy všetko.
V nasledujúcej lekcii, NumPy - Tvorba polí, si ukážeme, ako vytvoriť pole knižnice
NumPy ndarray pomocou už známych zoznamov Pythonu aj pomocou
metód, ktoré ponúka sama knižnica NumPy.
