====== 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)