Table of Contents
NumPy II – 2D tömbök (mátrixok), axis fogalma, aggregálás tengely mentén
Mi az a 2D tömb?
- 1D tömb = lista jellegű adatsor
- 2D tömb = sorok és oszlopok (táblázat)
Példa:
import numpy as np
matrix = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(matrix)
#Dimenzió lekérdezése:
print(matrix.shape)
Indexelés 2D tömbben
Indexelés: [sor, oszlop]
print(matrix[0, 0])
print(matrix[1, 2])
Teljes sor:
print(matrix[1, :])
Teljes oszlop:
print(matrix[:, 0])
Feladat: Hozz létre egy 3×3-as tömböt 0–8 értékekkel. Írd ki a második sort. Írd ki a harmadik oszlopot.
import numpy as np
arr = np.arange(9).reshape(3, 3)
print("Második sor:", arr[1, :])
print("Harmadik oszlop:", arr[:, 2])
Axis fogalma
- axis=0 → oszlopok mentén (sorokat “összevonjuk”)
- axis=1 → sorok mentén (oszlopokat “összevonjuk”)
Példa:
print(matrix.sum(axis=0)) print(matrix.sum(axis=1))
Feladat: Adott egy jegytábla:
jegyek = np.array([
[4, 5, 3],
[2, 4, 5],
[5, 5, 4]
])
- Számold ki tanulónként az átlagot.
- Számold ki tantárgyanként az átlagot.
import numpy as np
jegyek = np.array([
[4, 5, 3],
[2, 4, 5],
[5, 5, 4]
])
print("Tanulónkénti átlag:", jegyek.mean(axis=1))
print("Tantárgyankénti átlag:", jegyek.mean(axis=0))
Mátrixműveletek
Elemenkénti műveletek
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(A + B)
print(A * B)
- Mátrixszorzás
print(A @ B)
Feladat: Hozz létre két 2×2-es mátrixot. Számold ki az összegüket. Számold ki a mátrixszorzatot
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[2, 0], [1, 2]])
print("Összeg:", A + B)
print("Mátrixszorzat:", A @ B)
Valósabb adat példa (fájlból 2D)
Tegyük fel, hogy az adat2d.txt fájl tartalma:
1 2 3 4 5 6 7 8 9
Beolvasás:
import numpy as np
adat = np.loadtxt("adat2d.txt")
print("Shape:", adat.shape)
print("Oszlopátlag:", adat.mean(axis=0))
Összefoglaló feladatok
1.Feladat: Egy cég havi bevételeit tároljuk táblázatban (3 év × 12 hónap).
- Unordered List ItemGenerálj véletlen adatokat (pl. 100–500 közötti számokkal)
- Unordered List ItemSzámold ki:
- Évenkénti összbevétel
- Havi átlagbevétel (3 év átlaga)
import numpy as np
np.random.seed(0)
bevetel = np.random.randint(100, 501, size=(3, 12))
print("Évenkénti összes bevétel:", bevetel.sum(axis=1))
print("Havi átlagbevétel:", bevetel.mean(axis=0))
2. Feladat: Vizsgaeredmények elemzése (axis mély megértése)
Adott egy 8×5-ös mátrix, ahol:
- sorok = diákok
- oszlopok = tantárgyak pontszámai
Feladat:
- Generálj 8×5-ös véletlen pontszám mátrixot (0–100).
- Számold ki:
- diákonkénti átlagot (soronként)
- tantárgyankénti átlagot (oszloponként)
- Határozd meg:
- melyik diák teljesített a legjobban
- melyik tantárgy átlaga a legrosszabb
- Szűrd ki azokat a diákokat, akiknek az átlaga 60 alatt van.
- Normalizáld a pontokat oszloponként (tantárgyanként).
Kulcs: axis=0, axis=1, argmax, argmin, broadcasting.
import numpy as np
np.random.seed(0)
# 1. Generálás
pontok = np.random.randint(0, 101, (8, 5))
print("Pontok:\n", pontok)
#2. Átlagok
# Diákonként (sorok mentén → axis=1)
diak_atlag = np.mean(pontok, axis=1)
# Tantárgyanként (oszlopok mentén → axis=0)
tantargy_atlag = np.mean(pontok, axis=0)
print("Diák átlag:", diak_atlag)
print("Tantárgy átlag:", tantargy_atlag)
#Miért axis=1 a sor? Mert az aggregálás a második dimenzió mentén történik → soron belül számolunk.
#3. Legjobb diák, legrosszabb tantárgy
legjobb_diak = np.argmax(diak_atlag)
legrosszabb_tantargy = np.argmin(tantargy_atlag)
print("Legjobb diák index:", legjobb_diak)
print("Legrosszabb tantárgy index:", legrosszabb_tantargy)
#4. 60 alatti átlagú diákok
gyenge_diakok = np.where(diak_atlag < 60)[0]
print("60 alatti diákok:", gyenge_diakok)
#5. Oszloponkénti normalizálás
min_vals = np.min(pontok, axis=0)
max_vals = np.max(pontok, axis=0)
normalizalt = (pontok - min_vals) / (max_vals - min_vals)
print("Normalizált:\n", normalizalt)
#Broadcasting automatikusan működik oszloponként.
3. feladat: Éves hőmérsékleti adatelemzés (idősor mátrix)
Egy 12×30-as mátrix:
- sorok = hónapok
- oszlopok = napok
Feladat:
- Generálj normál eloszlású hőmérséklet adatokat.
- Számold ki:
- havi átlaghőmérsékletet
- napi éves átlaghőmérsékletet
- Határozd meg:
- melyik hónap volt a legmelegebb átlagosan
- melyik nap volt az év leghidegebb napja
- Számold ki, hány nap volt 30°C felett havonta.
- Standardizáld soronként (z-score normalizálás).
Kulcs: mean(axis=1), mean(axis=0), min, sum(axis=1).
#Generálás np.random.seed(1) homerseklet = np.random.normal(20, 10, (12, 30)) #Havi és napi átlag havi_atlag = np.mean(homerseklet, axis=1) napi_atlag = np.mean(homerseklet, axis=0) #Legmelegebb hónap legmelegebb_honap = np.argmax(havi_atlag) #Leghidegebb nap az évben leghidegebb_nap = np.unravel_index(np.argmin(homerseklet), homerseklet.shape) #30°C feletti napok havonta forro_napok = np.sum(homerseklet > 30, axis=1) #Z-score standardizálás soronként mean = np.mean(homerseklet, axis=1, keepdims=True) std = np.std(homerseklet, axis=1, keepdims=True) standardizalt = (homerseklet - mean) / std
4. feladat: Bevételi mátrix elemzése (összetett aggregáció)
Egy 6×4-es mátrix:
- sorok = hónapok
- oszlopok = üzletek
Feladat:
- Generálj bevételi adatokat.
- Számold ki:
- üzletenkénti éves bevételt
- havi összbevételt
- Határozd meg:
- melyik üzlet teljesített legjobban összesítve
- melyik hónap volt a legerősebb
- Számold ki az egyes üzletek piaci részesedését (%) az éves összbevételből.
- Skálázd a mátrixot 0–1 közé globálisan.
Kulcs: sum(axis=0), sum(axis=1), argmax, broadcasting.
#Generálás np.random.seed(2) bevetel = np.random.randint(1000, 5000, (6, 4)) #Éves bevétel üzletenként uzlet_eves = np.sum(bevetel, axis=0) #Havi összbevétel havi_osszes = np.sum(bevetel, axis=1) #Legjobb üzlet legjobb_uzlet = np.argmax(uzlet_eves) #Legjobb hónap legjobb_honap = np.argmax(havi_osszes) #Piaci részesedés osszes_bevetel = np.sum(bevetel) reszesedes = uzlet_eves / osszes_bevetel * 100 #Globális normalizálás min_v = np.min(bevetel) max_v = np.max(bevetel) skala = (bevetel - min_v) / (max_v - min_v)
5. feladat: Képmanipulációs alapfeladat (mátrix mint kép)
Egy 100×100-as mátrix egy szürkeárnyalatos képet reprezentál (0–255).
Feladat:
- Generálj egy ilyen mátrixot.
- Számold ki:
- teljes kép átlagfényességét
- soronkénti átlagfényességet
- Küszöbölés: minden 128 alatti érték legyen 0, felette 255.
- Normalizáld oszloponként.
- Számold ki, hány pixel világosabb az átlagfényességnél.
Kulcs: boolean indexelés + mean(axis=…).
#Generálás np.random.seed(3) kep = np.random.randint(0, 256, (100, 100)) #Átlagfényesség global_atlag = np.mean(kep) sor_atlag = np.mean(kep, axis=1) #Küszöbölés binary = np.where(kep < 128, 0, 255) #Oszloponkénti normalizálás min_col = np.min(kep, axis=0) max_col = np.max(kep, axis=0) norm_kep = (kep - min_col) / (max_col - min_col) #Átlag feletti pixelek száma vilagos_db = np.sum(kep > global_atlag)
6. feladat: Többdimenziós adat – Diák × Tantárgy × Félév
Generálj egy 3D tömböt: 2×10×4
- dimenzió = félév
- dimenzió = diák
- dimenzió = tantárgy
- Számold ki:
- diákonkénti átlagot félévenként
- tantárgyankénti átlagot teljes évre
- Határozd meg:
- melyik diák javított legtöbbet két félév között
- Szűrd ki azokat a diákokat, akiknek bármely félévben 50 alatti az átlaguk.
- Aggregáld az egész rendszert egyetlen globális átlagra.
- Normalizáld a 3D tömböt félévenként külön-külön.
Kulcs: többtengelyes aggregáció (axis=(…)), mean, sum, any.
#Geneálás np.random.seed(4) adat = np.random.randint(0, 101, (2, 10, 4)) #Diák átlag félévenként diak_atlag = np.mean(adat, axis=2) #Eredmény shape: (2, 10) #Tantárgy átlag teljes évre tantargy_atlag = np.mean(adat, axis=(0,1)) #Legnagyobb javulás javulas = diak_atlag[1] - diak_atlag[0] legnagyobb_javulas = np.argmax(javulas) #50 alatti átlag bármely félévben gyenge = np.any(diak_atlag < 50, axis=0) gyenge_indexek = np.where(gyenge)[0] #Globális átlag global_atlag = np.mean(adat) #Félévenkénti normalizálás min_vals = np.min(adat, axis=(1,2), keepdims=True) max_vals = np.max(adat, axis=(1,2), keepdims=True) normalizalt = (adat - min_vals) / (max_vals - min_vals)
