11. Vektorizace matematických operací#
11.1. Teorie#
Vektorizace matematických operací je technika, která umožňuje efektivně provádět matematické (ale i jiné) operace na celých souborech dat současně. Tím se eliminuje potřeba iterovat přes jednotlivé prvky souboru a provádět operace postupně. Namísto postupného zpracovávání jednotlivých prvků souboru je vektorizace schopna aplikovat operace na celý soubor jako celek. To vede ke kratšímu kódu, který se snadněji udržuje. Výpočet s velkými objemy dat je při vektorizaci rychlý, protože využívá výpočetních schopností moderních procesorů, které jsou optimalizovány pro práci s vektory dat.
V jazyce Python jsou nástroje pro vektorizaci v kníhovně NumPy.
11.2. Vektorizace pro vektor zadaný po složkách#
Představme si, že máme vektor x
, který obsahuje hodnoty populace v čase, a konstanty r
a K
. Chceme aplikovat funkci logistického růstu, tj. funkci
x
najednou pomocí vektorizace.
import numpy as np
# Vstupní hodnoty
x = np.array([0.1, 0.3, 0.5, 0.7])
r = 0.8
K = 1.0
# Logistický růst pomocí vektorizace
y = r * x * (1 - x / K)
Výstupem bude vektor y
, který obsahuje vypočítané hodnoty logistického růstu pro každý prvek vektoru x
. Každá operace (*
, -
, /
) je aplikována na celý vektor najednou, díky čemuž je kód kratší a rychlejší.
11.3. Vektorizace pro vektor vygenerovaný příkazem np.linspace
#
Ve výše uvedeném příkladě je vektor x
zadán z klávesnice. V praxi se pracuje s dlouhými seznamy dat, kdy jsou data buď načtena z externího souboru, nebo vygenerována příslušnými příkazy. Například následující kód vygeneruje díky přítomnosti příkazu np.linspace
do proměnné x
celkem 500 bodů rovnoměrně rozdělených na intervalu od 0 do 5 a každý tento bod dosadí do funkce
import numpy as np # knihovna pro numerické výpočty
import matplotlib.pyplot as plt # knihovna pro kreslení grafů
x = np.linspace(0,5,500) # 500 hodnot na vstupu
y = x**2/(x**2+1) # výpočet pro všech 500(!!!) vstupních hodnot
plt.plot(x,y) # graf pro kontrolu
Výstupem kódu je 500 funkčních hodnot v proměnné y
, které po vykreslení vedou na následující graf.
11.4. Úkol#
V poli je přednastaven kód pro rychlost růstu v prostředí s omezenou nosnou kapacitou (logistický růstem). Upravte kód tak, aby pro výpočet funkčních hodnot použil více bodů namísto čtyř explicitně zadaných. Do proměnné x
vložte 500 rovnoměrně rozložených hodnot z intervalu \([0,1]\).
import numpy as np
# Vstupní hodnoty
x = np.array([0.1, 0.3, 0.5, 0.7])
# ^^^ nahradit za np.linspace se spravnymi parametry
r = 0.8
K = 1.0
# Logistický růst pomocí vektorizace
y = r * x * (1 - x / K)
TIP: Pokud přidáte následující kód na konec skriptu, zobrazí se graf funkce. Pro čtyři hodnoty se bude jednat o lomenou čáru, pro 500 hodnot půjde o hladkou křivku.
import matplotlib.pyplot as plt
plt.plot(x,y)