Numpy isnan() Methode

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
vinc00
User
Beiträge: 13
Registriert: Freitag 21. Oktober 2022, 11:34

Hallo zusammen,

ich muss bei einer CSV Datei alle Zeilen löschen, wo Nan vorkommt. Das array heißt data. Meine Lösung wäre:

length = len(data)
for i in range(0, length, 1):
if np.isnan(data[i, 1]):
np.delete(data, i, 0)
return data

Allerdings funktioniert es nicht. Kann mir jemand vielleicht helfen?
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Verwende keine Schleifen auf Numpy-Arrays. Wenn man das macht, macht man nahezu immer etwas verkehrt.

Code: Alles auswählen

data = data[~np.isnan(data)]
vinc00
User
Beiträge: 13
Registriert: Freitag 21. Oktober 2022, 11:34

Kann ich auf diese Weise auch bestimmte Werte löschen. Also bis jetzt habe ich das so gemacht:

length = len(data)
for i in range(0, length, 1):
if 0.0005 < data[i, 0]%0.0025 < 0.9995:
np.delete(data, i, 0)

geht das auch leichter?
vinc00
User
Beiträge: 13
Registriert: Freitag 21. Oktober 2022, 11:34

Außerdem wenn ich "data = data[~np.isnan(data)]" benutzte macht der aus meinem 2D- ein 1D-Array
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man mit numpy for-Schleifen über einzelne Elemente benutzt, dann macht man mit großer Wahrscheinlichkeit etwas falsch. Array-Größen per np.append oder np.delete zu verändern bedeutet auch in 99% der Fälle, dass man nicht richtig mit Arrays arbeitet.

Dich interessiert ja auch nur die Nan-Werte in der zweiten Spalte:

Code: Alles auswählen

data = data[~np.isnan(data[:, 1])]
Wenn man Modulo 0.0025 rechnet, dann können niemals Zahlen größer als 0.0025 auftauchen, die Bedingung der oberen Grenze macht so also keinen Sinn. Mehrere Bedingungen bei Inidizierung muß man mit Bit-Operatoren (&, |, ~) ausdrücken nicht mit den logischen Operatoren (and, or, not).
Benutzeravatar
__blackjack__
User
Beiträge: 14031
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ergänzung: Bei den Bit-Operatoren muss man dann noch auf den Operatorvorrang achten und gegebenenfalls Klammern setzen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
vinc00
User
Beiträge: 13
Registriert: Freitag 21. Oktober 2022, 11:34

Also wäre soetwas wie, das folgende möglich?

data = data[~np.isnan(data[:,1]) & ~(data[:,0]-data[:-1,0]<0,.0025)]

oder kann Python damit nichts anfangen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Um die Frage zu beantworten, musst du das doch nur mal in Python laufen lassen. Hast du das nicht probiert? Das geht schneller, als hier ein Posting zu erstellen.
Benutzeravatar
__blackjack__
User
Beiträge: 14031
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich vermute das wird ein ``TypeError: bad operand type for unary ~: 'tuple'`` geben weil da ein Komma drin ist, was so sicher nicht gewollt war. 🤓 Davon mal abgesehen, kannst Du es doch einfach mal ausprobieren.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten