if abfrage innerhalb eines array

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
caneworld
User
Beiträge: 14
Registriert: Donnerstag 6. November 2008, 12:34

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
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

ein Beispiel wäre wohl hilfreich, oder?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
caneworld
User
Beiträge: 14
Registriert: Donnerstag 6. November 2008, 12:34

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Code: Alles auswählen

gtz = sum(20-wert for wert in tmwerte if wert>15)
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.
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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
caneworld
User
Beiträge: 14
Registriert: Donnerstag 6. November 2008, 12:34

<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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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:

Code: Alles auswählen

(Tinnen-a[a >= 15]).sum()
Zuletzt geändert von Darii am Montag 24. November 2008, 20:48, insgesamt 3-mal geändert.
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

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)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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. :wink:
caneworld
User
Beiträge: 14
Registriert: Donnerstag 6. November 2008, 12:34

was berechnet werden soll ist das hier.

Bild

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
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

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?
Zuletzt geändert von tordmor am Montag 24. November 2008, 21:32, insgesamt 1-mal geändert.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ... :wink:
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

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))
caneworld
User
Beiträge: 14
Registriert: Donnerstag 6. November 2008, 12:34

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
:wink:

so long thx und gn8
Antworten