Was bedeutet das??

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
Elmar91
User
Beiträge: 10
Registriert: Dienstag 10. Mai 2011, 08:13

Code: Alles auswählen

Von welcher Stadt wollen Sie die Daten abfragen?b
    mittelwert_ta[I] =stadt[0,grenzen].mean()
TypeError: string indices must be integers, not tuple
Traceback (most recent call last):
  File "C:\Users\Elmar\Desktop\Übung 4.py", line 64, in <module>
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Steht doch da. Slicing geht mit `:`.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Elmar91
User
Beiträge: 10
Registriert: Dienstag 10. Mai 2011, 08:13

könntest du das noch ein bischen amateurhafter erklären :) danke
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Code: Alles auswählen

>>> a = "hallo du"
>>> print a[2:5]
llo
>>> print a[2,5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string indices must be integers, not tuple
>>> 
BlackJack

@Elmar91: Ich würde sagen jbs hat die falschen Schlussfolgerungen gezogen.

Du versuchst bei ``stadt[0,grenzen]`` einen Indexzugriff mit dem Tupel ``(0, grenzen)``. Und die Fehlermeldung sagt Dir, dass so ein Indexzugriff mit einem Tupel bei Zeichenketten nicht funktioniert. Dass Du danach versuchst eine Methode auf dem Ergebnis dieses Zugriffs aufzurufen die wohl einen Mittelwert berechnet, legt die Vermutung nahe, dass Du `stadt` vielleicht gar nicht an eine Zeichenkette, sondern vielleicht an ein `numpy`-Array binden wolltest.

Code: Alles auswählen

In [66]: 'Berlin'[0,3]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

TypeError: string indices must be integers, not tuple
Elmar91
User
Beiträge: 10
Registriert: Dienstag 10. Mai 2011, 08:13

BlackJack hat geschrieben:@Elmar91: Ich würde sagen jbs hat die falschen Schlussfolgerungen gezogen.

Du versuchst bei ``stadt[0,grenzen]`` einen Indexzugriff mit dem Tupel ``(0, grenzen)``. Und die Fehlermeldung sagt Dir, dass so ein Indexzugriff mit einem Tupel bei Zeichenketten nicht funktioniert. Dass Du danach versuchst eine Methode auf dem Ergebnis dieses Zugriffs aufzurufen die wohl einen Mittelwert berechnet, legt die Vermutung nahe, dass Du `stadt` vielleicht gar nicht an eine Zeichenkette, sondern vielleicht an ein `numpy`-Array binden wolltest.

Code: Alles auswählen

In [66]: 'Berlin'[0,3]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

TypeError: string indices must be integers, not tuple
das heißt ich muss jetzt genau was machen :D ich bin echt ein blutiger anfänger auch wenn das von der Übung her nicht so aussieht aber deshalb werde ich dieses Semester auch wieder wiederholen;)
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Was genau soll diese Zeile denn bewirken?

Code: Alles auswählen

mittelwert_ta[I] =stadt[0,grenzen].mean()
Elmar91
User
Beiträge: 10
Registriert: Dienstag 10. Mai 2011, 08:13

Also hier die Aufgabenstellung :
Aufgabenstellung
Schreiben Sie ein Programm, das fur die Wetterdaten aus Ubung 4 die Heizgradstunden
bzw. die Gradtagszahl berechnet. Die Gradtagszahl ist eine
wichtige Groe zur Berechnung des Heizwarmeverbrauchs von Gebauden und
hangt ab vom Standort, der Heizgrenztemperatur und der gewunschten Innentemperatur.
Geben Sie die Ergebnisse tabellarisch aus. Machen Sie sich zunachst mit den
Begrien Gradtagszahl und Heizgradstunden vertraut. Siehe hierzu
Wikipedia,
Recknagel, Sprenger, Schrameck, Taschenbuch der Heizungstechnik
DIN 4108
VDI 3807
Hinweise
Verwenden Sie fur die Berechnung der Gradtagszahl eine Funktion mit
den notwendigen Parametern Auentemperatur als Array, Innentemperatur,
Heizgrenztemperatur
Berechnen Sie Tagesmittelwerte der Umgebungstemperatur
Summieren Sie uber alle 365 Tage auf
Zahlen Sie nur Tage mit Auentemperaturen, die kleiner als die Heizgrenztemperatur
sind Hierzu konnen Sie eine Schleife verwenden oder
die Funktion numpy.where

Dann hier mein geschriebenes Programm dazu:

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Created on Mon May 30 22:52:30 2011

@author: Elmar
"""
Name = "Elmar Bickel"
Matrikelnummer = "03000162"
print "%s\tMatrikelnummer: %s\n" % (Name,Matrikelnummer)
print "Uebung 4\n"
import numpy as np
def G(z,Ta):
    b=0
    G=0
    while b<z:
        G=G+(20.-Ta[x])
        b=b+1
    return G
def H(z,Ta):
    b=0
    H=0
    while b<z:
        H=H+(15.-Ta[x])
        b=b+1
    return H
while True:
    stadt=raw_input("Von welcher Stadt wollen Sie die Daten abfragen?")
    
    if stadt=="B or b":
        werte= np.loadtxt("Berlin.dat",skiprows=4,usecols=(4,8),
                  unpack=True)
        print ""
        print "Berlin"
    elif stadt=="M or m":
        werte= np.loadtxt("Muenchen.dat",skiprows=4,usecols=(4,8),
                  unpack=True)
        print ""
        print "Muenchen"
    elif stadt=="K or k":
        werte= np.loadtxt("Koeln.dat",skiprows=4,usecols=(4,8),
                  unpack=True)
        print ""
        print "Koeln"
    elif stadt=="H or h":
        werte= np.loadtxt("Hamburg.dat",skiprows=4,usecols=(4,8),
                  unpack=True)
        print ""
        print "Hamburg"
    elif stadt=="F or f":
        werte= np.loadtxt("Frankfurt.dat",skiprows=4,usecols=(4,8),
                  unpack=True)
        print ""
        print "Frankfurt"
    x=stadt[0]
    mittelwert_ta=range(365)
    mdict= {}
    l=0
    k=24
    I=0
    Ta=[]
    while I<=364:
        mdict[I] =[l, k]
        grenzen =slice(mdict[I][0], mdict[I][1])
        mittelwert_ta[I] = stadt[0,grenzen].mean()
        l=l+24
        k=k+24
        I=I+1
    for i in range(365):
        if mittelwert_ta[i]<=15:
            Ta.append(mittelwert_ta[i])
    z=len(Ta)

    F=G(z,Ta)
    print "Gradtagszahl bei 20 Grad Innentemperatur",F
    B=H(z,Ta)
    print "Heizgradzahl",B
        
    n=raw_input("Wenn Sie noch weitere Daten einer anderen Stadt wollen geben Sie J ein")
    if n!="J or j":
        break
BlackJack

@Elmar91: Beantworte noch die Frage von sparrow: Was soll die Zeile bewirken? Was ist Deiner Meinung nach zu dem Zeitpunkt an dem diese Zeile ausgeführt wird an den Namen `stadt` gebunden und in welcher Zeile passiert das Deiner Meinung nach?

Du solltest vielleicht erst einmal ein Python-Tutorial für die Grundlagen durcharbeiten. Die verschiedenen Schleifenarten und wann man welche verwendet, "slicing" bei Listen und anderen Sequenzen, ”list comprehension”, beziehungsweise auch die Möglichkeiten die `numpy` bietet.

Die Funktionen `G` und `H` sind fast identisch, warum ist das nicht *eine* Funktion mit entsprechender Parametrisierung? Ausserdem sind die Namen schlecht, weil sie nicht wirklich etwas aussagen. Innerhalb einer Funktion deren Namen für das Ergebnis zu verwenden, ist auch etwas verwirrend. Python ist kein BASIC oder Pascal. Beim Aufruf der beiden Funktionen fällt auf, dass das `z` immer die Länge des zweiten Arguments ist — warum wird das dann übergeben? Die Information steckt doch im zweiten Argument schon drin. Und überlege mal wo das `x` in den beiden Funktionen herkommt. Getestet hast Du die Funktionen anscheinend nicht!

Wiederholungen im Quelltext sollte man vermeiden. Das Laden der Werte ist für alle Städte nahezu gleich, das sollte man also nur einmal hin schreiben und die Unterschiede als Daten heraus ziehen. Das Ganze kann man im Grunde auf die Städtenamen beschränken, zum Beispiel in dem man vor der Endlosschleife aus den Namen ein Wörterbuch von Anfangsbuchstaben auf Stadtnamen erstellt. Dann kann man sich zur Eingabe den entsprechenden Städtenamen geben lassen und die Daten dafür laden.

In Python ist es unüblich Listen mit einer bestimmten Anzahl von ”Dummy”-Werten zu erstellen und die dann in einer Schleife nacheinander über einen Index durch die eigentlichen Werte zu ersetzen. Man baut solche Listen auf, in dem man die Elemente der Reihe nach berechnet und hinten anhängt. Alternativ durch ”list comprehensions”.

Was soll `mdict`? Das wird nirgends *wirklich* verwendet. Es macht den Code nur unnötig kompliziert. Kann es sein dass Du da nicht wirklich nachgedacht hast, sondern einfach nur Quelltext aus der letzten Aufgabe kopiert hast?

Das Programm macht den Eindruck als wenn das alles oder zumindest ein grosser Teil geschrieben wurde, bevor Du es das erste mal hast laufen lassen. Das ist keine gute Idee. Man sollte immer ein Stückchen programmieren und dann erst einmal testen ob das bis dahin überhaupt läuft. Was gibst Du denn ein, nach dem Du das Programm gestartet hast? Und wird daraufhin ein Städtename ausgegeben? Nein!? Dann solltest Du *das* erst einmal lösen bevor Du weiter programmierst. Nach dem die Werte geladen wurden, solltest Du einen Testlauf machen und prüfen ob die Werte auch tatsächlich geladen wurden. Und so weiter. Immer Stück für Stück und erst zum nächsten Verarbeitungsschritt weiter gehen, wenn das Programm soweit funktioniert. Wenn etwas nicht funktioniert, macht es wenig Sinn Code zu schreiben der Daten verwendet, die gar nicht korrekt erstellt wurden.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Elmar91 hat geschrieben:

Code: Alles auswählen

[...]
    if stadt=="B or b":
[...]
Du solltest dir wirklich das Tutorial vornehmen. Dringend.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben: Was soll `mdict`? Das wird nirgends *wirklich* verwendet. Es macht den Code nur unnötig kompliziert. Kann es sein dass Du da nicht wirklich nachgedacht hast, sondern einfach nur Quelltext aus der letzten Aufgabe kopiert hast?

Das Programm macht den Eindruck als wenn das alles oder zumindest ein grosser Teil geschrieben wurde, bevor Du es das erste mal hast laufen lassen.
Wenn man sich denCode der letzten Aufgabe mal ansieht, dann erkennt man ja schnell, dass die Passage rund um das Abfragen und Laden der Städtedaten stumpf kopiert wurde. Ich habe so die Vermutung, dass der OP Meteorologie o.ä. studiert und dort das Programmieren nur Mittel zum Zweck ist - das ändert zwar nichts daran, dass man sich mit den Grundlagen und Idiomen befassen muss, aber würde erklären, wieso der OP Hinweise bezüglich Modularisierung vs. Copy&Paste-Programmierung konsequent ignoriert ;-)

PS: Meteorologen arbeiten afaik noch viel mit Pascal und Fortran - wundert mich ja, dass da Python verwendet wird! Nuja, vielleicht ist meine Annahme da doch falsch :-D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Laut Ergebnis einer Suchmaschine ist es die Fachrichtung Energiesysteme. Die Aufgabe hier geht wohl darum wie viel man an verschiedenen Standorten heizen muss, um eine bestimmte Mindesttemperatur zu haben.

Ich hatte mal einen Werkvertrag bei der Meteorologie der FU-Berlin an dem zwei (inkl. mir) Python- und ein PHP-Entwickler beteiligt waren. Nicht für's ”number crunching” sondern als ”Klebstoff” zwischen den Simulations- und Auswertungsprogrammen. Python hat dabei Shellskripte ersetzt.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Hyperion hat geschrieben:Meteorologen arbeiten afaik noch viel mit Pascal und Fortran - wundert mich ja, dass da Python verwendet wird!
Fortran, ja! Aber Pascal? Ich bin selbst Meteorologe und ich arbeite extrem viel mit Python. Mit Python arbeitet es sich IMHO sehr viel angenehmer als mit Matlab oder IDL. Und ich kenne viele Kollegen, die das ähnlich sehen. Ich kann ich mir gut vorstellen, das Python in einigen Jahren IDL verdrängt haben wird, da Python fast immer als Alternative zu IDL genannt wird.

Programmieren als "Mittel zum Zweck" ist IMHO übrigens kein Ausrede um schlechten Code zu schreiben. ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

gkuhl hat geschrieben: Fortran, ja! Aber Pascal?
Nen Kumpel von mir hat das als Nebenfach studiert und war da lange Hiwi. Ich meine mich zu erinnern, dass er da auch von Pascal-Programmen geredet hat - nuja, vielleicht habe ich mich da auch geirrt.
gkuhl hat geschrieben: Programmieren als "Mittel zum Zweck" ist IMHO übrigens kein Ausrede um schlechten Code zu schreiben. ;)
Hab ich auch nie gesagt ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten