Knižnica numpy¶
Knižnica numpy
umožňuje efektívne pracovať s mnohorozmernými dátovými poľami. Mnohorozmerné polia s číselnými hodnotami sa označujú ako tzv. tenzory a sú zovšeobecnením číselných vektorov a matíc. Tenzory budeme používať ako základné dátové typy pre reprezentáciu dát pri učení neurónových sietí.
Vytvorenie a inicializácia¶
numpy
pole môžeme vytvoriť priamo zo zoznamu v jazyku Python. Na rozdiel od zoznamov musia byť všetky hodnoty numpy
poľa rovnakého typu.
import numpy as np
a = np.array([1, 2, 3, 4, 5])
a
Takto môžete vytvoriť a inicializovať aj viacrozmerné polia.
a = np.array([[1, 2, 3],[3, 4, 6]])
Rozmer poľa môžete zistiť pomocou vlastnosti shape
, ktorá obsahuje n-ticu čísel s rozmermi jednotlivých dimenzií poľa.
a.shape
numpy
poskytuje viacero metód na vytvorenie polí s preddefinovanou hodnotou.
a = np.ones((3,4,2)) # pole s rozmerom 3x4x2, všetky prvky rovné 1
b = np.zeros((3,4,2)) # pole s rozmerom 3x4x2, všetky prvky rovné 0
c = np.full((3,3,3), -np.inf) # pole s rozmerom 3x3x3, všetky prvky nastavené na danú hodnotu (napr. -nekonečno)
d = np.random.random((3,2)) # pole s rozmerom 3x2 (matica) s prvkami inicializovanými náhodne z intervalu [0, 1)
e = np.empty((3, 2)) # neincializované pole daného rozmeru, môže obsahovať ľubovoľné čísla
f = np.empty_like(e) # vytvorí neinicializované pole s rovnakým rozmerom a typom, aké má zadané pole
g = np.arange(1, 10) # vytvorí vektor inicializovaný na postupnosť čísel od 1 (vrátane) do 10 (bez)
# podobne ako pre funkciu `range` je možné zadať aj krok postupnosti
Indexovanie¶
numpy
polia je možné indexovať podobne ako zoznamy cez hranaté zátvorky (na rozdiel od zoznamu sa však indexujú cez jednu zátvorku do, ktorej sa zadajú indexy pre jednotlivé dimenzie).
a = np.array(([[1, 2, 3, 4],[5, 6, 7, 8], [9, 10, 11, 12]]))
a[0,2]
Pre indexovanie môžete pre každú dimenziu zadať aj rozsah indexov v tvare od
(vrátane) : do
(bez).
a[:2, 1:3] # vyberie z matice `a` prvé dva riadky a stĺpce s indexmi 1 a 2
Indexy pre každú dimenziu môžeme zadať aj ako zoznamy.
a[[0,1,2],[0,1,0]] # stĺpec 0 sa bude opakovať 2x
Z numpy
poľa môžeme jednoducho vybrať všetky hodnoty, ktoré spĺňajú zadanú podmienku. Najprv si vygenerujeme pole s Boolovskými hodnotami True
ak je podmienka pre daný prvok splnená (inak False
).
mask = a < 8
mask
Pomocou indexovania podľa Boolovského poľa vyberieme iba prvky spĺňajúce danú podmienku, výsledok je vždy vektor hodnôt.
a[mask]
Dátové typy¶
numpy
podporuje rozličné dátové typy. Pri numerických typoch sa rozlišujú celé resp. desatinné čísla (typ np.int
resp. np.float
), znamienko a veľkosť/presnosť hodnôt (napr. celé kladné číslo od 0 do 255 reprezentované 8 bitmi má typ np.uint8
). Okrem numerických typov je podporovaný aj Boolovský typ a všeobecný typ np.object
, ktorý môže obsahovať ľubovoľné objekty jazyka Python.
a = np.array([1, 2, 3, 4], dtype=np.float)
mask.dtype # typ poľa môžete zistiť pomocou vlastnosti `dtype`
Základné operácie¶
numpy
priamo podporuje základné matematické operácie vyhodnotené na jednotlivých prvkoch.
x = np.array([[1, 2], [3, 4]], dtype=np.float)
y = np.array([[5, 6], [7, 8]], dtype=np.float)
z = x - y
z = x + y
z = x * y
z = x / y
z = np.sqrt(x) # na prvky polí je možné aplikovať aj rôzne funkcie (`sin`, `cos`, `sqrt`, `floor` atď.)
Operátor *
predstavuje násobenie po prvkoch, ak chcete vynásobiť dve matice, resp. vektor a maticu, použite metódu dot
.
y = np.array([[5, 6, 7], [8, 9, 10]], dtype=np.float)
x.dot(y) # vynásobíme maticu `x` o rozmeroch 2x2 s maticou `y` o rozmeroch 2x3, výsledok je matica o rozmeroch 2x3
v = np.arange(3) # vygenerujeme si vektor s 3 prvkami (0, 1, 2)
y.dot(v) # násobíme maticu `y` (2x3) s vektorom `v` (3x1), výsledok je vektor (2x1)
v.dot(y.T) # násobenie matíc vo všeobecnosti nie je symetrické, preto musíme v opačnom poradí maticu `y`
# transponovať na rozmer 3x2
Na polia môžu byť aplikované aj rôzne agregačné funkcie, ktoré pracujú s viacerými prvkami, napr. min
, max
, mean
, atď.
x.mean() # priemerná hodnota (cez všetky prvky)
x.max() # maximum
x.min() # minimum
Rozšírenie operácií nad poľami rôznych rozmerov¶
numpy
umožňuje aplikovať väčšinu operácií aj v prípade, že sa rozmery polí úplne nezhodujú, pričom sa snaží dimenzie vhodne rozšíriť (tzv. broadcasting). Pre rozšírenie musia byť rozmery kompatibilné, tzn. najprv sa pole s menším počtom dimenzií rozšíri na rovnaký počet ako pole s väčším počtom doplnením dimenzií s rozmerom 1 a potom sa všetky dimenzie porovnajú, pričom musí platiť:
- rozmery oboch dimenzií sú rovnaké, alebo
- rozmer jednej z nich je 1
Napr. pole s rozmermi 3x3x4x5 je kompatibilné s poľom 4x5, alebo 3x1x5, ale nie je kompatibilné s poľom 4x4, alebo napr. 2x1x1.
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]) # `x` je matica o rozmeroch 4x3
v = np.array([1, 0, 1]) # `v` je vektor s rozmerom 3
# po rozšírení bude mať vektor `v` rozmer 1x3, ktorý je kompatibilný s rozmerom matice 4x3
# matica `x` je preto chápaná ako zoznam 4 vektorov (riadkov), ku ktorým sa pripočíta postupne vektor `v`
# výsledok bude matica o rozmeroch 4x3
y = x + v
y
Spájanie a rozdeľovanie polí¶
Viacero polí môžeme spojiť podľa novej, alebo existujúcej dimezie pomocou funkcie stack
a concatenate
.
x1 = np.array([1, 2, 3])
x2 = np.array([4, 5, 6])
x3 = np.array([7, 8, 9])
x = np.stack([x1, x2, x3, x2]) # `stack` vytvorí novú dimenziu
print(x.shape)
x = np.concatenate([x1, x2, x3]) # `concatenate` spojí polia podľa existujúcej dimenzii
print(x.shape) # (prednastavená je prvá dimenzia s indexom 0)
Pre rozdelenie polí podľa náhodného výberu napr. na trénovacie a testovacie dáta je vhodné použiť funkcie z knižnice scikit-learn
.
from sklearn.model_selection import train_test_split
x = np.random.random((10,4)) # matica `x` predstavuje vstupné atribúty (4 atribúty, 10 príkladov)
y = np.arange(10) # vektor `y` predstavuje výstupný (cieľový) atribút
# rozdelíme dáta na trénovacie (%70 z celkového počtu) a testovacie náhodným výberom
# pre replikovateľnosť nastavíme inicializáciu náhodných čísel `random_state`
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=1234)
print(y_train, y_test)
Vizualizácia hodnôt¶
Dáta môžete vizualizovať pomocou knižníc matplotlib
a seaborn
.
import matplotlib.pyplot as plt
Pre základné X-Y zobrazenie môžete použiť funkciu plot
.
x = np.arange(0, 3 * np.pi, 0.1) # vygenerujeme si hodnoty pre os X - postupnosť od 0 do 3*Pi s krokom 0.1
y = np.sin(x) # pre os Y vypočítame sínus X
plt.plot(x, y) # vytvoríme a zobrazíme graf
plt.show()
V jednom grafe môžete kombinovať viacero dát, resp. meniť jeho nastavenia a popis.
z = np.cos(x)
plt.plot(x, y) # vytvoríme priebeh pre sínus
plt.plot(x, z) # do toho istého grafu zobrazíme kosínus
plt.xlabel('x axis label') # zmeníme popis osí, nadpis grafu a legendu
plt.ylabel('y axis label')
plt.title('Sine and Cosine')
plt.legend(['Sine', 'Cosine'])
plt.show() # zobrazíme vygenerovaný graf
Viac informácií o knižinici matplotlib
nájdete tu (v angličtine).