Matematikai Algoritmusok és Felfedezések I.

7. Előadás: Numpy

2021 március 22.

Tudományos csomagok (Python Scientific stack)

csomag
NumPy Hatékony N-dimenziós tömb
SciPy Numerikus számítások
Matplotlib Grafikonok és rajzok
IPython (Jupyter) Interaktív notebook
SymPy Szimbolikus számítások
Pandas Adatbányászat

Numpy

A Python Scientific stack (és sok más) alap modulja.

https://numpy.org/

Mandelbrot halmaz

A Mandelbrot-halmaz azon $c$ komplex számokból áll, melyekre az alábbi $x_{n}$ rekurzív sorozat:

$x_{1}=c$

$x_{n+1}:=(x_{n})^{2}+c$

nem tart végtelenbe, azaz abszolút értékben (hosszára nézve) korlátos.

Importálási konvenció: import numpy as np

N-dimenziós tömbök

A numpy központi objektuma az ndarray ($n$-dimenziós tömb).

A.shape egy tuple a tömb dimenzióival, alakjával.

Többdimenzió

Többdimenziós tömbökkel sok helyen találkozhatunk. Egyik tipikus megjelenésük a képek tárolása. Minden tömb egy háromdimenziós tömb, ahol az első két dimenzió az x és y koordinátának felel meg, a harmadik mentén pedig felsoroljuk az RGB értékeket. Az RGB értékek 0 és 255 közötti egészek.

dtype

A listákkal ellentétben nem tárolhatunk benne bármit! A dtype megadja a tárolt elemek típusát

Megadhatjuk a dtype-ot amikor létrehozzuk a tömböt.

String tömbök

Fix hosszúságú karakter tömböket tárol!!

Az elemek elérése

Egy sor:

Egy oszlop:

egy elem:

néhány sor vagy oszlop

Operációk

Elemenkénti műveletek

A leggyakrabban használt matematikai fügvények is elérhetőek és elemenként hatnak.

Logikai műveletek

Indexelés listákkal (Advanced indexing)

Egy listával vagy tömbbel fogjuk megadni, hogy hanyadik elemeket szeretnénk.

Több dimenzióban komplikálódnak a dolgok.

Ha egyetlen index tömbbel indexelünk, annak elemei megfelelnek M első kordináta szerint vett elemeinek.

Ha több index tömbbel indexelünk, akkor az első az első koordinátnak a második a másodiknak, ... felel meg.

Többször is kiválaszthatjuk ugyanazt a sort vagy oszlopot:

Többdimenzióban még komplikáltabba a helyzet. https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

A tömb alakjának megváltoztatása

A reshape függvénnyel megváltoztathatjuk a tömb alakját anélkül, hogy a tartalmazott elemek megváltoznának, vagy akár lemásolódnának a hattérben.

ValueError hibát kapunk ha rosz alakot adunk meg.

Ha -1-et adunk meg, megpróbálja kitalálni, hogy annak a dimenziónak mekkorának kell lennie az elemek száma alapján.

A resize akkor is működik, ha az elemek száma nem passzol. Ilyenkor töröl, vagy feltölt nullákkal. Magát a tömböt változtatja meg.

Tömbök létrehozása

Ritkán akarjuk egyesével megadni az elemeket, ezért van egy csomó gyorsabb módszer:

Az np.ones_like() és np.zeros_like() függvények megtartják a formát és a dtype-ot!

Az egyik leghasznosabb, hogy az indexek függvényében is definiálhatjuk a tömböt:

Tömbök összeragasztása

Bármelyik dimenzió szerint ragaszthatunk, ha megfelelőek a dimenziók.

Mivel általában az első vagy második koordináta szerint ragasztunk, ezekre vannak rövidítések:

np.stack egy új dimenzió szerint egymás mellé rakja a tömböket

Iteráció

Alapból az első koordináta szerint van iterálás:

De természetesen csinálhatunk ilyet:

És végigiterálhatunk az összes elemen is:

Broadcasting

Különböző méretű tömbökkel is tudunk műveleteket végrehajtani, ha az alakjaik megfelelnek néhány feltételnek.

Például egy $1\times 1$-es tömb összesorozható egy több dimenziós tömbbel, mintha skalárral szoroznánk.

De különböző méretű tömbökön nem tudunk elemenkénti műveletet végrehajtani:

Azt, hogy mi történjen a broadcasting határozza meg. Ha valamelyik dimenzió mérete 1, akkor akkor az a dimenzió brodacastolható , azaz olyan széles lehet a dimenzió, amit a művelet akar.

Több dimenzió egyszerre is broadcastolható:

Pontos működés

Ha mondjuk egy array alakja (1,3,1) akkor az első és a harmadik dimenzió broadcastolható. Ekkor egy [x,y,z] index hármast [0,y,0]-ként értelmez a Python. Tehát a broadcastolt dimenziókban 0-nak tekintjük az indexet.

Nem létező dimenziókat is broadcastolhatunk, így lehet, hogy egy egydimenziós tömb összeadható egy két vagy háromdimenzióssal. Ekkor a hiányzó dimenziót elfelejtjük. Például egy ha az két tömb alakja (k,) és (i, j, k) és összadjuk őket akkor az (a,b,c) indexből (c) lesz. Tehát a kamu dimenziókat előre szúrjuk be.

Meg is mondhatjuk, hogy hol hozzon létre új dimenziókat, a none kulcsszóval.

Tehát ekkor így változnak a dimenziók: (3, None, None) + (3, 2, 2) = (3, 2, 2)

Példa

Rács a komplex számsíkon:

Tengely menti aggregálás

Tengely menti szummázás:

mean, std, var hasonlóan működik az átlag, szórás és szórásnégyzet kiszámolására.

Indexelés Bool értékekkel

Feltételnek megfelelő elemek kiválasztása:

Az átlagnál nagyobb elemek:

np.where visszatér azokkal a tömbökkel, amik a speckó indexeléshez kellenek, ha a feltételnek megfelelő elemeket akarjuk:

Mandelbrot halmaz

A Mandelbrot-halmaz azon $c$ komplex számokból áll, melyekre az alábbi $x_{n}$ rekurzív sorozat:

$x_{1}=c$

$x_{n+1}:=(x_{n})^{2}+c$

nem tart végtelenbe, azaz abszolút értékben (hosszára nézve) korlátos.