====== NumPy I – tömbök (array), lista vs. NumPy array, vektorizált műveletek ====== ==== Mi az a NumPy? ==== NumPy = numerikus számításokra optimalizált Python könyvtár. Telepítés: pip install numpy Importálás: import numpy as np Miért nem elég a lista? * Lassabb nagy adatmennyiségnél * Nincs valódi vektorművelet * Matematikai műveletek körülményesek ---- ==== Lista vs. NumPy array ==== import numpy as np #lista szamok = [1, 2, 3, 4] print(szamok * 2) #Ez nem elemenkénti szorzás! #NumPy array arr = np.array([1, 2, 3, 4]) print(arr * 2) #Ez elemenként szoroz. **Feladat:** * Hozz létre egy listát: [10, 20, 30, 40] * Alakítsd NumPy array-jé * Szorozd meg 3-mal import numpy as np lista = [10, 20, 30, 40] arr = np.array(lista) print(arr * 3) 35–55 perc – Tömb létrehozása különböző módokon Példák np.zeros(5) #csak nullák np.ones(5) #csak egyesek np.arange(0, 10, 2) #mint range, de array np.linspace(0, 1, 5) #intervallum felosztása **Feladat:** Hozz létre egy array-t 0-tól 20-ig 5-ös lépéssel. Hozz létre 6 darab 1-est tartalmazó tömböt. import numpy as np arr1 = np.arange(0, 21, 5) arr2 = np.ones(6) print(arr1) print(arr2) 55–65 perc – Szünet 65–85 perc – Indexelés és szeletelés Példa arr = np.array([10, 20, 30, 40, 50]) print(arr[0]) print(arr[1:4]) **Szeletelés: start:end** **Feladat:** Hozz létre egy 0–9-ig terjedő array-t. Írd ki az első 5 elemet. Írd ki az utolsó 3 elemet import numpy as np arr = np.arange(10) print(arr[:5]) print(arr[-3:]) ---- ==== Vektorizált műveletek ==== NumPy műveletek elemenként történnek. arr = np.array([1, 2, 3, 4]) print(arr + 5) print(arr ** 2) print(arr.mean()) Fontos: * Nincs szükség for ciklusra * Gyorsabb és tisztább kód Feladat: Hozz létre egy array-t 1–5-ig. Számold ki a négyzetüket. Számold ki az átlagukat import numpy as np arr = np.arange(1, 6) negyzet = arr ** 2 atlag = arr.mean() print("Négyzetek:", negyzet) print("Átlag:", atlag) ---- ==== Összefoglaló feladatok ==== 1. Feladat: Az adat.txt fájl számokat tartalmaz. Írj programot, ami: * Beolvassa a számokat NumPy array-be * Kiszámolja az átlagot és szórást * Kiírja az eredményeket import numpy as np adat = np.loadtxt("adat.txt") print("Átlag:", np.mean(adat)) print("Szórás:", np.std(adat)) 2. Feladat – Lista vs NumPy teljesítmény és műveletek Hozz létre 1 millió elemű számlistát: * sima Python listával * NumPy tömbbel * Szorozd meg minden elemét 2-vel: * listán ciklussal * NumPy array-n vektorizáltan * Mérd az időt. * Hasonlítsd össze az eredményeket. import numpy as np import time # Lista lista = list(range(1_000_000)) start = time.time() uj_lista = [] for x in lista: uj_lista.append(x * 2) print("Lista idő:", time.time() - start) # NumPy array = np.arange(1_000_000) start = time.time() uj_array = array * 2 print("NumPy idő:", time.time() - start) 3. Feladat – Fájlbeolvasás és statisztikai elemzés Adott egy adatok.txt fájl, amely soronként számokat tartalmaz. * Olvasd be listába. * Alakítsd NumPy tömbbé. * Számold ki: * átlag * szórás * minimum * maximum * Szűrd ki a 10 feletti értékeket (vektorizáltan). import numpy as np def beolvasas(fajlnev): lista = [] try: with open(fajlnev, "r") as f: for sor in f: lista.append(float(sor.strip())) except FileNotFoundError: print("A fájl nem található!") return lista lista = beolvasas("adatok.txt") array = np.array(lista) print("Átlag:", np.mean(array)) print("Szórás:", np.std(array)) print("Minimum:", np.min(array)) print("Maximum:", np.max(array)) szurt = array[array > 10] print("10 felettiek:", szurt) 4. Feladat – Mátrixműveletek és vektorizált számítás * Generálj egy 5x5-ös véletlen mátrixot. * Számold ki: * soronkénti összeget * oszloponkénti átlagot * Normalizáld a mátrixot (0–1 közé skálázás). * Ne használj ciklust, csak NumPy műveleteket. import numpy as np matrix = np.random.randint(1, 100, (5, 5)) print("Mátrix:\n", matrix) # Sorösszeg sor_osszeg = np.sum(matrix, axis=1) print("Sorösszegek:", sor_osszeg) # Oszlopátlag oszlop_atlag = np.mean(matrix, axis=0) print("Oszlopátlag:", oszlop_atlag) # Normalizálás min_val = np.min(matrix) max_val = np.max(matrix) normalizalt = (matrix - min_val) / (max_val - min_val) print("Normalizált mátrix:\n", normalizalt) 5. Feladat – Két dimenziós adatfeldolgozás (vizsgaeredmények) * Egy 2D NumPy tömb sorai diákok, oszlopai tantárgyak pontszámai. * Számold ki minden diák átlagát. * Számold ki a tantárgyankénti átlagot. * Szűrd ki azokat a diákokat, akiknek az átlaga 60 alatt van. * Hasonlítsd össze listás és NumPy megoldással. import numpy as np pontok = np.array([ [70, 80, 90], [50, 40, 60], [90, 95, 100], [30, 50, 45] ]) # Diák átlag diak_atlag = np.mean(pontok, axis=1) print("Diák átlagok:", diak_atlag) # Tantárgy átlag tantargy_atlag = np.mean(pontok, axis=0) print("Tantárgy átlagok:", tantargy_atlag) # Bukottak bukott_index = np.where(diak_atlag < 60) print("Bukott diák indexek:", bukott_index) 6. Feladat – Idősoros adatelemzés (komplex) * Generálj 365 napos hőmérsékleti adatot. * Számold ki: * éves átlag * legmelegebb 10 nap * hány nap volt 30°C felett * Mozgóátlag (7 napos). * Oldd meg ciklus nélkül, vektorizáltan. import numpy as np # Generált adatok homerseklet = np.random.normal(20, 10, 365) # Éves átlag print("Éves átlag:", np.mean(homerseklet)) # Legmelegebb 10 nap legmelegebb = np.sort(homerseklet)[-10:] print("Top 10 meleg nap:", legmelegebb) # 30 fok feletti napok print("30 fok feletti napok száma:", np.sum(homerseklet > 30)) # 7 napos mozgóátlag kernel = np.ones(7) / 7 mozgo_atlag = np.convolve(homerseklet, kernel, mode='valid') print("Mozgóátlag első 10 értéke:", mozgo_atlag[:10])