Seite 1 von 1
if abfrage innerhalb eines array
Verfasst: Montag 24. November 2008, 18:16
von caneworld
ein freundliches hallo an alle
ich steh hier gerade vor einem problem andem ich gerade scheitere. ich schreibe momentan an einem programm das beliebige (genormte) wetterdatensätze auslesen und verarbeiten kann.
ich hab diverse daten mittels berechnet und die liegen nun brav in arrays. jetzt sollte ich aber nur auf einzellne elemente in einem array zugreifen um dameit weiterrechnen zu können.
mein erster gedanke war also eine einfache if-abfrage. blöder weise klappt das nicht
muss ich bei einem array etwas anderes anwenden, eine spezielle andere abfrage.
so long ...
(der nichtmehr weiter wissender) caneworld
Verfasst: Montag 24. November 2008, 18:18
von nemomuk
ein Beispiel wäre wohl hilfreich, oder?
Verfasst: Montag 24. November 2008, 18:19
von numerix
Damit kann man nicht viel anfangen.
Kann es sein, dass du eine Liste und kein Array meinst?
Wozu die if-Abfrage? Was genau soll das denn leisten?
Etwas konkreter - evtl. auch mal mit ein paar Datensätzen und Code - sollte es schon sein.
Verfasst: Montag 24. November 2008, 18:40
von caneworld
sorry, ich dachte meine beschreibung kann man verstehen ...
ich versuchs nochmal
Code: Alles auswählen
def heiz(tmwerte):
Tinnen = 20
GTZ = 0
if tmwerte <= 15:
GTZ = sum(Tinnen - tmwerte)
return GTZ
das hier wäre die grundlegende funktionsweise. das array "tmwerte" beinhaltet insgesamt 8760 (float) zahlenwerte. ich möchte nun in der variablen "GTZ" alle werte, die größer sind als 15, von Tinnen abziehen und die summe daraus bilden.
aber mein gedanke mit der if-abfrage klappt net
Verfasst: Montag 24. November 2008, 18:58
von numerix
Der Sinn dieser Berechnung scheint mir aber sehr zweifelhaft.
Evtl. müsste noch so etwas wie der Betrag mit einbezogen werden?
Oder die Anzahl der Werte >15, um einen arithm. Mittelwert zu bilden?
Im übrigen offenbart deine Lösungsidee noch ein grundlegendes Nichtverstehen im Umgang mit Listen.
Verfasst: Montag 24. November 2008, 19:00
von BlackJack
Meinst Du vielleicht so etwas?
Code: Alles auswählen
def heiz(tmwerte):
return sum(20 - tmwert for tmwert in tmwerte if tmwert <= 15)
Wobei ich auch *noch* einmal nachfrage was für einen Typ `tmwerte` hat!? Und zwar den *genauen* Typ, ein `array` gibt's nämlich nicht. In der Standardbibliothek gibt's `array.array` und bei solchen Aufgaben verwenden die Leute auch mal gerne ein `numpy.array`. Es kann aber auch sein, dass Du fälschlicherweise zu einer Liste (Typ `list`) "array" sagst. Deswegen die Nachfragen.
Verfasst: Montag 24. November 2008, 19:39
von Darii
Sollte es ein numpy.array sein kannst du es auch mit
Code: Alles auswählen
def heiz(tmwerte):
Tinnen = 20
return sum(Tinnen - tmwerte[tmwerte <= 15])
machen, aber das ist eine Eigenheit von numpy.array mit normalen listen und array funktioniert es wie oben schon erwähnt.
Verfasst: Montag 24. November 2008, 20:00
von caneworld
<type 'numpy.ndarray'>
ist doch ein array, oder nicht?
der sinn und zweck der berechnung ist in etwa die bestimmung der stunden pro jahr, in abhängigkeit der außentemperatur, bei denen man ein gebäude beheizen muss und daher wichtig für eine dimensionierung einer heiz/kühlanlage zur optimalen ausnutzung von eingesetzter energie.
ich vermute jetzt mal das ihr denke "was zur hölle macht der kerl" und "wenn interessiert denn sowas schon"
aber sowas ist für einen angehenden ingenieur in zeiten von explodierenden energie kosten durchaus sinnvoll
Verfasst: Montag 24. November 2008, 20:29
von Darii
caneworld hat geschrieben:<type 'numpy.ndarray'>
ist doch ein array, oder nicht?
Jein. Es ist der Array-Datentyp von Numpy, der nicht zur Standardbibliothek von Python gehört(im Gegensatz zu array.array). Da das einen Unterschied ausmacht ist es bei der Fehlersuche hilfreich zu wissen, von welchem Array du sprichst.
Jedenfalls kannst du es damit so wie von mir vorgeschlagen machen, das ist um einiges schneller.
Oder noch schneller:
Verfasst: Montag 24. November 2008, 20:35
von tordmor
caneworld hat geschrieben:<type 'numpy.ndarray'>
ist doch ein array, oder nicht?
der sinn und zweck der berechnung ist in etwa die bestimmung der stunden pro jahr, in abhängigkeit der außentemperatur, bei denen man ein gebäude beheizen muss und daher wichtig für eine dimensionierung einer heiz/kühlanlage zur optimalen ausnutzung von eingesetzter energie.
ich vermute jetzt mal das ihr denke "was zur hölle macht der kerl" und "wenn interessiert denn sowas schon"
aber sowas ist für einen angehenden ingenieur in zeiten von explodierenden energie kosten durchaus sinnvoll
Als Ingenieur sollte Dir klar sein, dass eine gute Lösung eine klare Aufgabenstellung voraussetzt. Es hapert hier ein wenig. Soweit ich es bisher verstanden habe, haben wir ein numpy array mit 24h/d * 365 d/a Temperaturwerten. Wenn es zu kalt ist, soll auf die Temperatur von 20° geheizt werden. Was mir noch nicht klar ist, ist was als Ergebnis der Funktion herauskommen soll. Von Deinem Code her würde ich sagen, die summe der Temperaturdifferenzen bis 20° für alle Temperaturen, die max. 15° betragen. Das wäre dann:
Code: Alles auswählen
def heiz(tmwerte):
return sum(20 - t for t in tmwerte if t <= 15)
Du schreibst aber oben "... alle werte, die größer sind als 15,...". War das ein Irrtum, oder habe ich es falsch verstanden?
Später schreibst Du aber "... die bestimmung der stunden pro jahr ..." das liesse darauf schließen, dass als Ergebnis eine Anzahl an Stunden, in denen die Temperatur max. 15° beträgt herauskommen soll. das wäre dann:
Code: Alles auswählen
def heiz(tmwerte):
return len(t for t in tmwerte if t <= 15)
Verfasst: Montag 24. November 2008, 20:40
von numerix
tordmor hat geschrieben:Als Ingenieur sollte Dir klar sein, dass eine gute Lösung eine klare Aufgabenstellung voraussetzt.
Das ist mal ein guter Satz!
In der Tat, abgesehen von dem Widerspruch zwischen dem Vergleich der Temperatur im Quelltext und der Beschreibung, auf den du hinweist und der seinen Niederschlag z.B. schon in den - bis auf diesen Punkt - fast identischen Codesnippets von BlackJack und mir gefunden hat, ist das, was bisher berechnet wurde, auch ein ziemlich unbrauchbarer Wert.
Dein Vorschlag geht da inhaltlich sicher in eine brauchbarere Richtung.

Verfasst: Montag 24. November 2008, 21:19
von caneworld
was berechnet werden soll ist das hier.
wobei hier ti = Tinnen
und ta = tmwerte
und wie ihr bemerkt hab, hab ich eine schwäche im formulieren. sowas wie legasthenie mit formulieren. kann ja auch nix dafür
zum größer, kleiner problem ... da hab ich mich tatsächlich vertanvertan. es sollte natürlich kleiner heißen
Verfasst: Montag 24. November 2008, 21:30
von tordmor
Ok, es handelt sich um die
Gradtagzahl. So wie ich den Artikel verstanden habe muss zunächst erstmal für jeden Tag die Durchschnittstemperatur berechnet werden, da das Array mit Stundentemperaturen vorliegt. Und dann wird für jeden Monat summiert und nicht über das ganze Jahr.
Rückgabewert wäre also ein 365-tuple mit Tages- oder ein 12-tuple mit Monatswerten. Für letzteres braucht man eine Kalenderfunktion um die Tage den Monaten zuordnen zu können ... alles andere als trivial.
Noch eine Frage: Was ist mit Schaltjahren? Hat das Array dann 24 Einträge mehr?
Verfasst: Montag 24. November 2008, 21:32
von numerix
Zum einen ist die Formel so unbrauchbar (weil der Laufindex nicht festgelegt ist), zum anderen: Was soll das Ergebnis denn aussagen? Was bringt denn die reine Addition der Temperaturdiffferenzen?
Edit: Dank tordmor sind wir jetzt schlauer und der Nebel lichtet sich.
Wäre nicht verkehrt gewesen, wenn du selbst uns entsprechende Infos oder einen hilfreichen Link geliefert hättest ...

Verfasst: Montag 24. November 2008, 22:15
von tordmor
Auf die Schnelle hab ich mal dashier gebastelt:
Code: Alles auswählen
def ta(temp):
"Tagesdurchschnittstemperatur für jeden Tag des Jahres bei stündlichen Messungen."
return tuple(sum(temp[i+j] for j in range(24)) / 24 for i in range(int(len(temp) / 24)))
def gradtagzahl(ta, ti=20, hg=15, year=None):
"Gradtagzahl nach VDI 2067 aus Tagesdurchschnittstemperaturen."
cal = calendar.Calendar()
if not year:
year = datetime.datetime.today().year
return tuple(sum(ti - ta[i] for i,x in cal.itermonthdays2(year, j) if ta[i] < hg) for j in range(1,13))
Verfasst: Montag 24. November 2008, 22:20
von caneworld
der rest des programms funktioniert (mittelwerte, graphische ausgabe etc...) es scheiterte nur an der <= 15 abfrage
macht euch keine sorgen, vielleicht bin ich im programmieren noch nicht der fiteste. am verständnis was ich berechne mangelts bei mir sicher nicht.
ich hab hier schließlich nicht danach gefragt ob jemand von euch das programm für mich schreibt sondern nur nach einer hilfe bei einem relativ kleinen problem an dem ich gescheitert bin. schließlich möchte ich ja was lernen
bei interesse kann ich den ganzen quellcode nächste woche gerne mal posten
ich bedanke mich natürlich bei jedem der mir geholfen hat
unterumständen kann ich auch mal behilflich sein. zwar vermutlich nicht beim programmieren aber wer allgemein eine frage zu energie hat, schreibt mich an
so long thx und gn8