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!"

Készítsd el weboldaladat ingyen! Ez a weboldal a Webnode segítségével készült. Készítsd el a sajátodat ingyenesen még ma! Kezdd el