2. diel - Dátové typy
V predchádzajúcej lekcii, 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ále knižnice NumPy v Pythone sa najskôr pozrieme na to, aké nové dátové typy knižnica do Pythona 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 stručne, aké dátové typy má Python defaultne. V skratke je ich týchto päť:
string
- reťazec znakovinteger
- celé číslofloat
- číslo s desatinou čiarkoucomplex
- komplexné číslobool
- logická hodnota
Ako zistiť typ údajov 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 konzoly dostaneme:
Determining the variable type:
class 'str'
class 'int'
class 'float'
class 'complex'
class 'bool'
Pokiaľ chceme vypísať v prostredí Jupyter Notebooku iba
jednu premennú, nemusíme 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
Napokon 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ť.
Pre 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ť av 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 Pythona.
Celý zoznam vrátane konštrukcií sa nie je potrebné učiť naspamäť! Ide skôr o orientáciu. A pri inicializácii polí sa vytvorí ten správny typ automaticky
Jednotlivé dátové typy NumPy
Poďme sa pozrieť na jednotlivé dátové typy konkrétne.
U
-
unicode string
(reťazec unicode znakov)
Tento dátový typ je ekvivalentný typu string
v Pythone.
Vytvoríme ho takto:
s = 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 integer
v Pythone. V
určitých prípadoch sa nám bude hodiť, že ho možno definovať aj ako
int32
, int64
a dokonca môžeme použiť aj
ľubovoľnú ďalšiu mocninu dvojky od 8
do 256
.
Štandardne sa používa int32
, ale pre veľmi veľké čísla je
potrebné použiť jeho násobnú verziu. Potom síce v pamäti počítača
zaberie miesto 32 bitov rovno 64 (respektíve 128, či 256), ale niekedy nie je
zvyšok.
Na vytvorenie premennej tohto typu použijeme nasledujúci kód:
my_int32 = np.int32(64) # The numbers in the argument are given just as an example. my_int64 = np.int64(1325) # In reality, they can be any values.
Pokiaľ 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 skôr v zriedkavých prípadoch. Oproti typu
integer
totiž unsigned integer
neumožňuje ísť pod
nulu. Využijeme ho napríklad pokiaľ optimalizujeme množstvo využitej
pamäte počas behu programu a pritom pracujeme s veľmi vysokými nezápornými
číslami.
Rovnako ako integer
, aj typ u
je možné použiť
vo variante s väčším rozsahom bitov. Pokiaľ použijeme konštruktor bez
čísla, počet bitov sa zvolí automaticky. Oproti konštruktoru typu
integer
(viď predchádzajúca sekcia) sa ale nepíše podtržítko
za názvom:
my_uint = np.uint(23)
f
- float
(číslo s desatinnou čiarkou)
Typ f
je ekvivalent dátového typu float
v
Pythone. Opäť je možné zvoliť počet bitov pri vytváraní premennej. Alebo
použiť konštruktor s podčiarkovníkom, ako v prípade typu
i
.
my_float = np.float_(1.414)
Pri type float
sa v praxi často stáva, že nám záleží na
čo najdlhšej časti za desatinou čiarkou bez zaokrúhlenia. Preto sa pre
"dvojnásobný float" (teda vlastne float32
) zaviedol typ
double
. Aj takto je možné float
v NumPy
inicializovať:
my_double = np.double(3.141592)
c
- complex
(komplexné číslo)
Komplexné čísla sa vytvoria jednoducho z komplexných čísel, ako ich poznáme v Pythone:
my_complex = np.complex_(complex(2, 3))
b
- boolean
(logická premenná)
Podobne ako predchádzajúce typy, aj boolean
sa vytvára a
funguje podobne, ako ho bežne poznáme v Pythone:
my_bool = np.bool_(True)
Podčiarknutie za kľúčovým slovom bool
nie je
pri tomto type povinné. Zápisy np.bool_(True)
a
np.bool(True)
sú tak ekvivalentné. Väčšina programátorov
však volí skrátenú variantu np.bool(True)
, pretože je kratšia
a čitateľnejšia.
M
- datetime
(dátum
a čas)
Na uloženie času do premennej slúži typ datetime
. Spôsob
vytvorenia tejto premennej je opäť jednoduchý. Čas sa zadáva vo formáte
RRRR-MM-DDTHH:MM:SS
, kde RRRR
je rok, MM
je mesiac a DD
je deň. Znak T
sa napíše jednoducho
ako rozdelenie dátumu a času. HH
je hodina, druhé
MM
je minúta a SS
sú sekundy. 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 alebo čas, ak chceme. Tiež môžeme neuviesť napr.
sekundy. Poďme si ukázať niekoľko príkladov:
# 20. July 2023, 17h 23min 10.42s my_datetime1 = np.datetime64('2023-07-20T17:23:10.42') # 20. July 2023 my_datetime2 = np.datetime64('2023-07-20') # Works even without days my_datetime3 = np.datetime64('2023-07')
Ako zistiť typ obsiahnutý v NumPy objekte
Na záver si poďme ešte ukázať, ako zistíme konkrétny typ pri NumPy
objektoch. Slúži na to atribút dtype
a je to veľmi jednoduché.
Princíp funguje aj pre NumPy poľa.
Ukážme si príklady pre jednotlivé typy premenných:
my_int32 = np.int32(64) print(my_int32.dtype) # int32 my_int64 = np.int64(1325) print(my_int64.dtype) # int64 my_uint = np.uint(23) print(my_uint.dtype) # uint64 my_float = np.float32(1.414) print(my_float.dtype) # float32 my_double = np.double(3.141592) print(my_double.dtype) # float64 my_complex = np.complex_(complex(2, 3)) 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
uint32
float32
float64
complex128
bool
datetime64[ms]
To je k základným dátovým typom NumPy všetko.
V nasledujúcej lekcii, Tvorba polí, si ukážeme, ako vytvoriť pole knižnice
NumPy ndarray
. Ukážeme si, ako to urobiť pomocou už známych
zoznamov Pythonu aj pomocou metód, ktoré ponúka sama knižnica NumPy.