Massive Probleme mit Einlesen, Filtern, Sortieren

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
Jochen1980
User
Beiträge: 40
Registriert: Montag 15. August 2011, 18:44

Boah,

hocke da nun schon ewig dran:
ich habe eine einfache Datei, da sind pro Zeile ein Wert drin in der Form 0.002 .
Einige Werte darunter sind negativ aber absichtlich als unbrauchbar geflagt, das sind -0.032 und -0.033.

In meiner Analyse will ich die Wertemenge sortieren, da knallts gleich, die negativen Werte landen inmitten der positiven - keine Ahnung warum. Das Dumme ist, ich kriege es in R auch nicht hin, und so komme ich einem Ergebnis nicht näher. Mein vorheriger Versuch es in Python only zu machen und mich in Scipy und Numpy einzulesen, war auch erfolglos. Kurz: ich hocke hier seit Stunden an einem Problem, bei dem ich denke, das sollte binnen 30 Minuten gelöst sein - eigentlich erwartete ich da gar kein Problem - Shit!

Okay also nächster Umweg ... ich filtere die Werte einfach vorher, bevor ich diese an die Berechnungen weiterleite, aber auch das klappt so nicht wie ich will, ich erhalte zwar bei der Längenabfrage vor und nach dem Filtervorgang, dass rund ein Drittel der Werte raus ist, aber in der Kontrolldatei steht immer noch -0.032 etc.. Ich arbeite da direkt auf einer Liste und schmeiss da Werte raus, das geht in anderen Sprachen nicht, aber Python meckerte da nicht, vielleicht liegts da dran, das schaue ich mir nun an. Dazu muss ich wohl besser aufpassen, wann ich -0.032 als String betrachte und wann als Zahl, da kann ich auch noch einen Blick drauf werfen.

Wie sortiert man negative und positive Werte in einer Liste?
Was nutzt ihr für Debugging-Hilfen/-Methoden, wenn ihr schon lange an einem Fehler rumkrebst?

Hier mal ein Auszug der Werte:
U-Wert
-0.032
-0.032
-0.033
-0.033
0.0588928
0.0316154
-0.033
-0.033
0.0723648
-0.033
0.0972589
0.0209649
-0.033
0.0842229
0.0887424
-0.033

Und hier meine Filter-Rauskehr-Methode:

Code: Alles auswählen

def take_out_negative_flag_values():
    print( "take_out_negative_flag_values()")
    global uvals_rand
    global uvals_real
    for cur_rand_item in uvals_rand:
        if cur_rand_item == "-0.032": 
            uvals_rand.remove("-0.032")
        if cur_rand_item == "-0.033":
            uvals_rand.remove("-0.033")
    for cur_real_item in uvals_real:
        if cur_real_item == "-0.032": 
            uvals_real.remove("-0.032")
        if cur_real_item == "-0.033":
            uvals_real.remove("-0.033")
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Bist du sicher, dass in uvals_rand auch strings stehen? Du testet nämlich auf Strings.

Stefan
BlackJack

@Jochen1980: Man kann Listen zwar verändern, aber man sollte das nicht mit Listen tun über die man gerade iteriert. Wenn man Werte entfernt, bekommt der Iterator davon nämlich nichts mit und kann so Werte auslassen.

``global`` solltest Du aus Deinem Wortschatz streichen. Mal davon abgesehen, dass es hier gar nicht nötig gewesen wäre, sollte man in Funktionen auch nicht Datenstrukturen verarbeiten oder gar verändern, die nicht als Argumente an die Funktion übergeben wurden. Du machst in der Funktion auch das gleiche zweimal nur mit einer anderen Liste. Stattdessen wäre eine Funktion besser, die das nur *einmal* beschreibt und dann jeweils auf die beiden Listen angewandt wird. Genau für so etwas gibt es doch Funktionen.

Statt die Werte aus den Listen zu entfernen, solltest Du besser eine neue Liste erstellen, ohne die speziellen Werte. Das geht ganz einfach mit einer „list comprehension”.

Wann Du mit Zeichenketten und wann mit Zahlen arbeiten solltest, hängt im Grunde davon ab was Du mit den Daten machen möchtest und was sie repräsentieren. Bei Zahlen würde ich eigentlich immer bemüht sein die auch als Zahlen zu behandeln. Was natürlich in diesem Falle — exakte Vergleiche mit Gleitpunktzahlen — etwas problematisch sein kann. Wer Denkt sich denn so ein komisches Format aus wo Zahlen die nicht exakt repräsentiert werden können als Flags verwendet werden!?

Code: Alles auswählen

In [147]: -0.032
Out[147]: -0.032000000000000001

In [148]: -0.033
Out[148]: -0.033000000000000002
Zur Fehlersuche reichen mir in der Regel ``print``, `repr()`, und ab und zu mal `type()` aus. Hast Du Dir Deine Daten mal angeschaut? Sind da vielleicht noch Zeilenendezeichen enthalten?
Jochen1980
User
Beiträge: 40
Registriert: Montag 15. August 2011, 18:44

Danke habe die beiden Megaschnitzer nun entdeckt: reverse() dreht nur eine Liste und sortiert sie dabei nicht und das Iterator-Problem kann ich wie hier schon gesagt einfach dadurch lösen, dass ich eine neue Liste anlegen und statt 'if bla == true ... remove()' nehme ich nun 'if bla == false ... append()' und schon passt das alles. Schwere Geburt ...
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@Jochen1980: Sich in NumPy einarbeiten würde sich wirklich lohnen:

Code: Alles auswählen

In [14]: import numpy as np

In [15]: data = np.loadtxt('werte.dat', skiprows=1)

In [16]: data
Out[16]: 
array([-0.032    , -0.032    , -0.033    , -0.033    ,  0.0588928,
        0.0316154, -0.033    , -0.033    ,  0.0723648, -0.033    ,
        0.0972589,  0.0209649, -0.033    ,  0.0842229,  0.0887424, -0.033    ])

In [17]: data[data >= 0.0]
Out[17]: 
array([ 0.0588928,  0.0316154,  0.0723648,  0.0972589,  0.0209649,
        0.0842229,  0.0887424])
Grüße
Gerrit
Antworten