
76_HOMERSEKLET_MATRIX
76_HOMERSEKLET_MATRIX

- Oldjuk meg az előző alfejezet HOMERSEKLETEK feladatát úgy, hogy a hőmérsékleti adatokat egy mátrixba olvassuk be!
A táblázatkezelő egy celláját a cella címével: C8, a mátrix egy elemét a mátrix nevével és a sor és oszlop indexekkel adhatjuk meg: ho[2,8].
A táblázatkezelőben a tartomány: B1:D12, a mátrix elemei ho[i,j], ahol i=1...12, j=1..3.
Beolvassuk a hőmérsékleti adatokat a ho mátrixba és kiíratjuk a ho mátrix elemeit, azaz a beolvasott adatokat. Annyival bővítjük még a programunkat, hogy a fővárosok neveit is beolvassuk a nev vektorba.
n = 12
m = 3
Meghatározzuk, hogy 12 város (n) és mindegyikhez 3 napra vonatkozó hőmérséklet-adat (m) lesz feldolgozva.
nev = [""] * n
Létrehozunk egy üres listát nev néven, amely a városok neveit tárolja. Ez 12 elemű, mert 12 város van.
ho = [[0] * m
for _ in range(n)]
Létrehozunk egy 2D listát (mátrixot) ho néven, amely minden városhoz 3 hőmérsékleti értéket tárol. Kezdetben minden elem 0.
f_nap = 0
Egy számlálót hozunk létre f_nap néven, hogy később megszámolhassuk, hány nap volt fagyos (hőmérséklet < 0).
fagyott = False
Egy logikai változót hozunk létre fagyott néven, amely jelzi, hogy történt-e fagy (alapértelmezés szerint nem).
with open("europa_ho.prn", "r") as be:
for i in range(n):
nev[i] = be.readline().strip()
ho[i] = [float(x) for x in be.readline().split()]
Megnyitjuk az "europa_ho.prn" fájlt olvasásra. A fájl minden sorából beolvassuk a város nevét (nev[i]) és a hozzá tartozó három hőmérsékleti adatot (ho[i]). Az adatokat lebegőpontos számokká (float) alakítjuk.
for i in range(n):
print(nev[i], end=" ")
for j in range(m):
print(ho[i][j], end=" ")
print()
Kiírjuk a városok neveit és azok hőmérsékleti adatait. A külső ciklus a városokon (n), míg a belső ciklus a napokon (m) iterál.
s = sum(sum(row)
for row in ho)
Kiszámoljuk az összes hőmérséklet összegét az egész mátrixban. Az sum(row) minden sor összegét adja meg, majd ezek összegezi egy másik sum() hívás.
atlag = s / (n * m)
Az általános hőmérsékleti átlagot az összeg (s) osztásával számoljuk ki a városok (n) és napok (m) számának szorzatával.
for i in range(n):
s = sum(ho[i])
print(f"{nev[i]} {s / m - atlag:.2f}")
Városonként kiszámítjuk a város saját átlagát, majd az eltérést az általános hőmérsékleti átlagtól. Az eredményt kiírjuk.
f_nap = sum(1 for row in ho for temp in row if temp < 0)
Összeszámoljuk azokat a napokat, amikor a hőmérséklet 0 fok alá esett (fagyott napok). Ez egyetlen számláló f_nap változóban tárolódik.
if f_nap == 0:
print("Nem fagyott")
else:
print("Fagyott")
Ha nem volt fagyott nap, kiírjuk, hogy "Nem fagyott". Ha volt, kiírjuk, hogy "Fagyott".
fagyott = False
for row in ho:
for temp in row:
if temp < 0:
fagyott = True
break
if fagyott:
break
Egy dupla ciklus segítségével ellenőrizzük, hogy van-e legalább egy nap, ahol a hőmérséklet 0 alatti. Ha találunk ilyet, fagyott értékét True-ra állítjuk és kilépünk a ciklusból.
if not fagyott:
print("Nem fagyott")else:
print("Fagyott")
Az előző ciklus alapján kiírjuk, hogy "Nem fagyott", ha nem találtunk fagyott napot. Ha igen, kiírjuk, hogy "Fagyott".
min_i, min_j = 0, 0for i in range(n):
for j in range(m):
if ho[i][j] < ho[min_i][min_j]:
min_i, min_j = i, j
Kiszámítjuk, hogy melyik város melyik napján volt a leghidegebb. A kezdeti minimum értéket az első város első napjára állítjuk (ho[0][0]), majd összehasonlítjuk az összes adattal.
print(f"A leghidegebb: {nev[min_i]} {ho[min_i][min_j]:.2f}")
Kiírjuk a leghidegebb város nevét és a hozzá tartozó minimum hőmérsékletet.
HOMERSEKLET_MATRIX.py
n = 12
m = 3
nev = [""] * n
ho = [[0] * m for _ in range(n)]
f_nap = 0
fagyott = False
with open("europa_ho.prn", "r") as be:
for i in range(n):
nev[i] = be.readline().strip()
ho[i] = [float(x) for x in be.readline().split()]
for i in range(n):
print(nev[i], end=" ")
for j in range(m):
print(ho[i][j], end=" ")
print()
s = sum(sum(row) for row in ho)
atlag = s / (n * m)
for i in range(n):
s = sum(ho[i])
print(f"{nev[i]} {s / m - atlag:.2f}")
f_nap = sum(1 for row in ho for temp in row if temp < 0)
if f_nap == 0:
print("Nem fagyott")
else:
print("Fagyott")
fagyott = any(temp < 0 for row in ho for temp in row)
fagyott = False
for row in ho:
for temp in row:
if temp < 0:
fagyott = True
break
if fagyott:
break
if not fagyott:
print("Nem fagyott")
else:
print("Fagyott")
# Legkisebb hőmérséklet meghatározása
min_i, min_j = 0, 0
for i in range(n):
for j in range(m):
if ho[i][j] < ho[min_i][min_j]:
min_i, min_j = i, j
print(f"A leghidegebb: {nev[min_i]} {ho[min_i][min_j]:.2f}")
Meteorológiai adatelemzés a városok hőmérsékleti mintázatai alapján
Egyszer volt, hol nem volt, volt egyszer egy varázslatos könyvtár, amit úgy hívtak: NumPy. Ez a könyvtár minden számológép és adatkezelő mágus legjobb barátja volt, hiszen bűvös erejével könnyedén kezelte a tömböket és számításokat.
n = 12
m = 3
A Matematika Birodalmában tizenkét város volt, mindegyik három napra vonatkozó hőmérsékleti adatokkal büszkélkedett. A birodalom tudósai kijelölték a n városokat és a m napokat, hogy megfigyeljék a változásokat.
f_nap = 0
fagyott = False
A birodalom tudósai létrehoztak egy üres könyvet (nev), amelyben a városok nevét tárolhatták. Egy másik lapra feljegyezték a hőmérsékleti adatokat (ho), és kezdetben minden értéket nullára állítottak. Kíváncsiak voltak arra is, hogy hány napot számoltak fagyottnak (f_nap), de egyelőre mindenki bízott abban, hogy nem fagyott még semmi!
with open("europa_ho.prn", "r") as be:
for i in range(n):
nev[i] = be.readline().strip()
ho[i] = list(map(float, be.readline().split()))
// vagy ho[i] = [float(x) for x in be.readline().split()]
Ez a kódrészlet ugyanazt a célt szolgálja, mint az eredeti map-es verzió, de listakomprehenzióval oldja meg az átalakítást. A fájlból beolvasott sor (be.readline().split()) elemeit egyenként lebegőpontos számmá alakítjuk (float(x)), és ezekből állítunk össze egy listát.
Egy nap a tudósok elővették a birodalom titkos krónikáját, az "europa_ho.prn"-t, amelyben a városok nevei és hőmérsékleti adatai szerepeltek. Sorban beolvasták a városok neveit, majd azok három napos hőmérsékletét.
for i in range(n):
print(nev[i], end=" ")
for j in range(m):
print(ho[i][j], end=" ")
print()
A tudósok izgatottan kiáltották ki a városok neveit, majd minden város hőmérsékletét is hangosan felolvasták, hogy mindenki hallja a birodalom lakói közül.
s = np.sum(ho)atlag = s / (n * m)
A király megparancsolta, hogy számolják ki a birodalom általános hőmérsékleti átlagát. Ehhez minden adatot összeadtak (s), majd elosztották a városok és napok számával, hogy megkapják az átlagot.
for i in range(n):
s = np.sum(ho[i])
print(f"{nev[i]} {s / m - atlag:.2f}")
A tudósok nem álltak meg az átlag kiszámításánál. Városról városra jártak, és kiszámították, mennyire tér el az adott város hőmérséklete az általános átlagtól. Az eredményeket hangosan kihirdették.
f_nap = np.sum(ho < 0)
Egy nap a varázslók megvizsgálták, hány olyan nap volt, amikor a hőmérséklet 0 fok alá esett. Ez volt a "fagyott napok" titokzatos számlálása.
if f_nap == 0:
print("Nem fagyott")else:
print("Fagyott")
A király elé járultak, hogy jelentést tegyenek. Ha nem voltak fagyott napok, örömmel kiáltották: "Nem fagyott!" Ám ha mégis, azt mondták: "Fagyott," és szomorkodtak.
fagyott = np.any(ho < 0)
A varázslók mágikus prizmájukkal átvizsgálták az adatokat, és megállapították, hogy létezik-e akár egyetlen fagyott nap is. Ez a bűvös ellenőrzés minden kétséget kizárt.
if not fagyott:
print("Nem fagyott")else:
print("Fagyott")
Újra jelentést tettek a királynak: ha a varázsló prizmája nem talált fagyott napot, mosolyogva mondták: "Nem fagyott!" Ha talált, sajnálkozva jelentették: "Fagyott."
min_index = np.unravel_index(np.argmin(ho), ho.shape)min_i, min_j = min_index
print(f"A leghidegebb: {nev[min_i]} {ho[min_i][min_j]:.2f}")
Végül a birodalom tudósai megkeresték a legkisebb hőmérsékletet és annak helyszínét. Büszkén jelentették: "A leghidegebb város: {nev[min_i]} volt, ahol a hőmérséklet {ho[min_i][min_j]:.2f} fokra esett!"