Häufigkeit Zahl < Mittelwert im 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
Lana
User
Beiträge: 3
Registriert: Samstag 27. Oktober 2012, 10:04

Kann mir bitte jmd weiterhelfen? Ich komme nicht mehr weiter!!!

Aufgabenstellung: Erstellen Sie einen Code, mit dem aus den Bohrkerndaten
ermittelt wird, wie oft der SO4-Wert niedriger als der mittlere SO4-Wert war

Code: Alles auswählen

# Funktionen zum Lesen der Daten werden verfuegbar gemacht
import pickle

# Daten einlesen
daten = pickle.load(open('bohrkern_py.dat','r'))  
feldnamen = ['Depth_icesnow_m', 'Age_ka_BP', 'Depth_we_m', 'Age_a_AD', 'NO3-_ugkg', 'SO42-_ugkg']  # Diese Liste enthaelt die Spaltenueberschriften


# Sulfatwerte "herausholen"
sulfat = daten [:,5]
print sulfat

# numpy- Funktionen verfuegbar machen
import numpy

#Mittelwert ermitteln
mittelwert = numpy.mean(daten[:,5])
print mittelwert
print numpy.mean(sulfat)# andere Schreibweise

#Anzahl aller SO4 Werte
anzahlSulfatWerte= len (sulfat)
print anzahlSulfatWerte

# soll sagen, ob der einzlene Wert kleiner ist als der Mittelwert
x = sulfat < mittelwert
print x
Zuletzt geändert von Hyperion am Samstag 27. Oktober 2012, 10:15, insgesamt 1-mal geändert.
Grund: Code in Code-Tags gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo und Willkommen im Forum!

bitte achte in Zukunft darauf, dass Du Python-Code unbedingt in die dafür vorgesehenen Code-Tags setzt. Wie Du ja wissen solltest, spielen Whitespaces eine wichtige Rolle in der Syntax von Python - wenn Du Code einfach so postest, gehen diese verloren. Ich habe das jetzt einmal für Dich übernommen... wenn ich das richtig überflogen habe, gibt es bei Dir tatsächlich keine einzurückenden Blöcke?

Darüber hinaus wird der Code dank besonderer Formatierung besser lesbar :-)

Zum Problem:
Sobald Du den Mittelwert berechnet hast, musst Du Deine Daten einfach durchgehen und für *jedes* Datum prüfen, ob es kleiner als der Mittelwert ist. Wenn ja, erhöhst Du einen Zählwert um eins. Dafür brauchst Du nur eine Schleife... so schwer ist das eigentlich nicht.

In welchem Kontext lernst Du denn Python?

Sinnvoller Weise würde man das Problem in einzelne, kleine, für sich separat funktionierende und testbare, Häppchen aufteilen; in diesem Falle wohl vor allem Funktionen. Also eine fürs Berechnen eines Mittelwertes aus einer Liste (oder eben numpy.Array), eine für den Kern der Aufgabe, also das Ermitteln der Anzahl der unterdruchschnittlich kleinen SO4-Anteile, eine für das Laden aus einer pickle-Datei und natürlich eine (``main``) für das Zusammenfügen der Funktionalitäten.

Je nach Vorkenntnissen und dem Kontext kann man Dir dann raten, ob Du das bisher erreichte besser umarbeiten solltest.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Lana: Schau Dir das Ergebnis von dem Vergleich an. Wahrheitswerte sind in Python ein Untertyp von ganzen Zahlen. Genauer hat `True` den Zahlenwert 1 und `False` den Zahlenwert 0. Jetzt kannst Du Dir überlegen welche Array-Methode zum zählen der `True`-Werte wohl geeignet ist.

Code: Alles auswählen

In [382]: type(True), type(False)
Out[382]: (<type 'bool'>, <type 'bool'>)

In [383]: issubclass(bool, int)
Out[383]: True

In [384]: int(True), int(False)
Out[384]: (1, 0)

In [385]: True + False
Out[385]: 1

In [386]: 42 + False
Out[386]: 42

In [387]: 42 + True
Out[387]: 43

In [388]: True + True
Out[388]: 2
Man kann das auch mit einer Schleife im Python-Code machen und sich jeden Wert einzeln anschauen, aber das dürfte nicht die volle Punktzahl geben.

Edit: Pickle-Daten sind Binärdaten und die Dateien sollten zum Lesen und Schreiben immer im Binärmodus geöffnet werden, sonst kann es passieren, dass die Daten nicht über Plattformgrenzen hinweg geladen werden können!
Lana
User
Beiträge: 3
Registriert: Samstag 27. Oktober 2012, 10:04

Wir machen das im Moment in der Uni...wir befinden uns gerade in den Kinderschuhen. Wir haben bisher nur 3 Stunden Crashkurs durchlebt.
Würdest du mir bitte einmal anhand meines Falls vormachen, wie das mit einer Schleife gehen würde? Die Sachen, die du mir geschrieben hast, habe ich noch nie gesehen!!
BlackJack

@Lana: Dir jetzt passende die Array-Methode oder Numpy-Funktion zu verraten; oder eine Schleife zu zeigen, die das macht was in der Aufgabe gefordert ist, würde bedeuten Dir Deine Hausaufgaben zu lösen. Das wird hier in der Regel nicht gemacht. Dazu gibt es auch ein Thema im „Allgemeine Fragen”-Forum: An alle Schüler und Studenten mit Informatikproblemen.

Und Dir eine allgemeine Schleife zu zeigen würde bedeuten Dir etwas zu zeigen was in jedem Python-Tutorial steht. Arbeite da einfach mal ein oder zwei von durch. Es gibt eines in der Python-Dokumentation. Und Learn Python The Hard Way richtet sich an Anfänger.

Dann gibt es speziell für Numpy auch Dokumentation und Tutorials. Schau Dich dort mal auf der Webseite um.
Lana
User
Beiträge: 3
Registriert: Samstag 27. Oktober 2012, 10:04

das ist ja nett, dass du mich gerne belehren möchtest, doch das ist nur ein Anwendungsbeispiel meinerseits. Ich möchte das Erlernte ja auch anwenden können....
also bekomme ich jetzt die Hilfe? Ich weiß ja wie eine einfache Schleife in der Theorie funktioniert - aber nicht, wenns an die konkrete Anwendung geht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Lana hat geschrieben: also bekomme ich jetzt die Hilfe? Ich weiß ja wie eine einfache Schleife in der Theorie funktioniert - aber nicht, wenns an die konkrete Anwendung geht.
Und wieso probierst Du es nicht einfach aus? Ich habe eher wenig mit ``numpy`` gearbeitet, aber ich denke doch, dass eine so grundlegende Datenstruktur iterierbar sein sollte...

Also: Öffne eine Python-Shell Deiner Wahl, lege Dir ein Dummy-Array an und versuche das dann in einer Schleife zu durchlaufen.

(Das geht auch idR. schneller, als hier zu posten ;-) )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Weil ich grad eh auf die Post warte und nett bin, hier mal ein Beispiel ohne ``numpy`` als Anregung, wie das prinzipiell umzusetzen ist:

Code: Alles auswählen

values = (1.23, 4.56, 0.07, 2.678, 3, 7.2)

average = sum(values) / len(values)

average
>>> 3.1229999999999998

count = 0

for value in values:
     if value < average:
         count += 1

print(count)
>>> 4
Man kann das auch als List-Comprehension kürzer schreiben:

Code: Alles auswählen

print(sum(1 for value in values if value < average))
>>> 4
So in der Art sollte das auch mit numpy-Arrays umzusetzen sein.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Lana: Das Beispiel von Hyperion auf den Quelltext übertragen, den Du schon hast.

Code: Alles auswählen

In [401]: values = numpy.array([1.23, 4.56, 0.07, 2.678, 3, 7.2])

In [402]: mean = values.mean()

In [403]: mean
Out[403]: 3.1229999999999998

In [404]: x = values < mean

In [405]: x
Out[405]: array([ True, False,  True,  True,  True, False], dtype=bool)
Ich weiss jetzt nicht wie man da noch helfen soll ohne dabei die komplette Lösung zu verraten, weil der letzte noch fehlende Schritt *so* *trivial* und *atomar* ist, dass man den auf zwei sehr einfach Arten umsetzen kann, wenn man die Grundlagen von Python aus einem Tutorial gelernt hat, oder sich zusammen mit dem Hinweis zur „Wertigkeit” von `True` und `False` als Zahlen und der Numpy-Dokumentation und einem Numpy-Tutorial beschäftigt hat.

Eine der beiden Lösungen hat Hyperion ja schon verraten, aber da würde ich zumindest nicht die volle Punktzahl erwarten, weil das mit einer `numpy`-Array-Methode oder einer `numpy`-Funktion einfacher und effizienter geht.
Antworten