3. diel - NumPy - Tvorba polí
V predchádzajúcej lekcii, NumPy - Dátové typy , sme sa pozreli na to, aké základné dátové typy používa knižnica NumPy a ako sa s nimi pracuje.
V tomto tutoriále knižnice NumPy v Pythone sa pozrieme na pole v knižnici NumPy a naučíme sa ich vytvárať. Vysvetlíme si, aké je dôležité udržiavať pole homogénne.
Pole v NumPy - ndarray
Polia, ktoré poskytuje knižnica NumPy, sa do značnej miery správajú podobne ako bežné zoznamy v Pythone. Je možné do nich ukladať najrôznejšie typy premenných - čísla, reťazce i všeobecné objekty a potom k prvkom pristupovať, prípadne ich meniť. Oproti bežným zoznamom v Pythone ale nie je možné do nich prvky pridávať a odoberať. Polia v NumPy majú pevne daný počet prvkov, podobne ako to majú polia v jazykoch C alebo Java.
Pole vs. zoznam - rozlíšenie pojmov
Ešte raz si zopakujme veľmi dôležitý poznatok, ktorý
sme spomenuli v lekcii NumPy - Predstavenie knižnice v
kapitole Zoznamy
v Pythone vs NumPy arrays. Zoznamy v Pythone sú
dynamické. Zodpovedajú tomu, čo v iných jazykoch označujeme ako
list
– zoznam. Oproti tomu v NumPy sa jedná o skutočné pole -
array
, ako ich poznáme z jazykov C či Java. V NumPy ich budeme
označovať aj ich technickým názvom ako ndarray
. Natívne
zoznamy Pythona a poľa NumPy budeme v tutoriáli striktne
odlišovať.
Ukážme si ešte pre istotu kód zoznamu a poľa: Vo výstupe konzoly dostaneme:
Poľa vs. zoznam - kedy použiť čo?
Prečo by sme mali použiť NumPy ndarray
, keď nám oproti
Pythonovskému zoznamu neumožňuje pridávať a odoberať prvky? Odpovede sú
dve - čas a priestor v pamäti. S poľom sa počítaču zaobchádza
jednoduchšie. Akonáhle sa raz pole vytvorí v pamäti, jeho dĺžka zostáva
až do zmazania Garbage Collectorom konštantná. Samozrejme sa občas nejaká
hodnota v ňom zmení, ale to je všetko.
Preto ak pracujeme s veľkým množstvom hodnôt alebo operácií, je
všeobecne rýchlejšie aj úspornejšie použiť ndarray
. Inak
samozrejme môžeme použiť aj základný Python zoznam.
Ako sa vytvára pole v NumPy
Existuje viacero spôsobov, ako vytvoriť ndarray
.
Najčastejšie použijeme "premenu" zoznamu pomocou metódy
np.array()
. NumPy však obsahuje mnoho ďalších zaujímavých
funkcií a metód, ktoré poskytujú ndarray
na výstupe. Pozrime
sa na niektoré z nich.
Vytvorenie NumPy poľa z Python zoznamu
Najprv si ukážeme už spomínanú metódu np.array()
:
Všeobecne je nevhodné miešať rôzne typy v jednom poli. Dátový typ NumPy poľa pri jeho vytvorení buď explicitne špecifikujeme, alebo je automaticky určený na základe hodnôt, ktoré do poľa vložíme. Pokiaľ vložíme do jedného poľa rôzne typy dát, NumPy ich všetky prevedie na jednotný typ. Vyberie pritom taký, ktorý dokáže reprezentovať všetky vložené hodnoty. Uveďme si príklad. Ak vytvoríme pole s celými číslami a jedno z nich bude desatinné, všetky čísla budú prevedené na desatinné. Podobne, ak pridáme reťazec do poľa s celými číslami, všetky čísla budú prevedené na reťazce. Je zrejmé, ako nepekne toto dokáže ovplyvniť výsledky matematických operácií.
Pretypovanie v poli je nákladné z hľadiska výkonu a ide o veľmi jednoduchý spôsob, ako si prirobiť naozaj nepríjemné problémy s neočakávaným správaním programu. Preto sa snažíme pole udržiavať homogénne.
No a ak budeme naozaj kreatívni a do jedného poľa namixujeme toľko typov,
že NumPy nedokáže nájsť jeden, ktorý by ich zastrešil, vznikne nám pole
prvkov object
:
Vo výstupe uvidíme:
Vytváranie viacrozmerných polí
Poďme si ukázať, ako s pomocou metódy np.array()
vytvoríme
viacrozmerné polia:
Prístup k prvkom v 3D poli
Naše pole_3D
má formát 2 x (2 x 3)
. Predstavme
si ho ako kinosála. Formát 2 x (2 x 3)
nám hovorí, že máme
prízemie a poschodie av každom z nich dva rady po troch sedadlách. Rozložme
si zápis poľa tak, aby bol intuitívnejší:
Zaujímavosťou je, že môžeme vytvoriť aj polia s "dimenziou 0":
V podstate tým do poľa uložíme iba jednu hodnotu. Ak vytlačíme obsah
premennej pole_0D
, dostaneme hodnotu 10
. Pokiaľ však
zistíme typ premennej, dostaneme ndarray
, nie
integer
:
V konzole uvidíme:
Náhodné celé číslo -
np.random.randint()
Metóda randint()
v module random
knižnice NumPy
je základná funkcia pre generovanie náhodných čísel typu
integer
. Ako pre vygenerovanie jednej náhodnej hodnoty, tak aj
celého (aj viacrozmerného) poľa náhodných hodnôt.
Funkcie a metódy v module random
máme k dispozícii buď
priamo z knižnice (np.random
), alebo si modul pridáme priamo ako
premennú. To je spôsob, aký budeme kvôli zjednodušeniu kódu používať v
tutoriáli:
Teraz už môžeme premennú
random
používať priamo.
Metóda randint()
funguje jednoducho a poznáme ju už z kurzu
Základná konštrukcia jazyka Pythonu z lekcie Knižnice
math a random. Nechajme si teda vygenerovať náhodné číslo od nuly do
devätnástich:
Je potrebné si
uvedomiť, že ako mnoho ďalších knižníc a funkcií v Pythone, aj NumPy
používa spodnú definovanú hranicu intervalu "vrátane" (inkluzívne) a
hornú hranicu "bez" (exkluzívne). V našom prípade kód
random.randint(20)
znamená v reči matematiky interval
<0; 20)
.
Pole náhod:-)
Pokiaľ chceme vytvoriť pole náhodných hodnôt, vyplníme metóde argument
požadovanej dĺžky poľa size
: Výstup v konzole:
Náhodný double
-
np.random.rand()
Metóda rand()
má trochu odlišnú syntax. Táto metóda
generuje náhodné číslo medzi 0
a 1
. Opäť v
half-open intervale, avšak tentoraz <0; 1)
. Pokiaľ chceme
získať desatinné číslo v inom intervale, musíme funkciu
rand()
prenásobiť a posunúť. Povedzme, že chceme náhodné
číslo v intervale <10, 30)
:
Viac si o náhodných
číslach povieme v ďalších lekciách. Teraz sa presunieme na vytváranie
polí. NumPy ndarray
pomocou metódy rand()
vytvoríme
tak, že do argumentu dáme číslo označujúce rozmer poľa, ktoré
chceme:
Získali sme polia troch čísel z intervalu <0,1)
. Podobne
vytvoríme aj viacrozmerné polia - jednoducho len pridáme číslo označujúce
ďalší rozmer:
Pre čísla v inom intervale ako <0,1)
opäť
použijeme posunutie násobením a pripočítaním čísla.
To je pre túto lekciu všetko.
V nasledujúcej lekcii, NumPy - Základné operácie s poľami , sa naučíme pristupovať k prvkom uloženým v NumPy poliach a tiež pole prechádzať.