numpy nan add

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
sophy
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:34

Hallo!

Ich habe ein scheinbar triviales Problem:
Ich möchte auf ein array ein Skalar addieren, also auf jedes Element: array2=array1+30. Das Problem: in dem array stehen auch nans. Ich bekomme folgende Fehlermeldung:

Traceback (most recent call last):
File "./gme_cs_pdf_z_height.py", line 554, in <module>
cs_DBZ=cs_dbz+30.
ValueError: function not supported

In matlab sind nans kein Problem, sie werden einfach übersprungen. Wie das mit python geht habe ich leider auch nach langer Suche nicht herausfinden können. Gibt es sowas wie numpy.nanmax() nur eben fürs addieren eines Skalars?

Das array wird aus einer NetDCF datei eingelesen, folgende modeule binde ich ein:

import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from Scientific.IO.NetCDF import *
import datetime

Ich bin für jede Hilfe sehr dankbar!

Sophy
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Du suchst masked arrays.

Also sowas wie:

Code: Alles auswählen

array2 = numpy.ma.array(array1, mask=array1 == numpy.NAN) + 30
sophy
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:34

Super, das funktioniert tatsächlich auf Anhieb! Werd mich da direkt mal einlesen was man da so alles mit machen kann. Vielen Dank!
sophy
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:34

Nur noch zur Info: Die Identifikation von NaNs funktioniert nur folgendermassen:

array2=numpy.ma.array(array1,mask=numpy.isnan(array1))
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

sophy hat geschrieben:Nur noch zur Info: Die Identifikation von NaNs funktioniert nur folgendermassen:

array2=numpy.ma.array(array1,mask=numpy.isnan(array1))
Beide Formen müßten eigentlich äquivalent sein. Aber wie es scheint gibt es zur Zeit noch unaufgelöste Bugreports für numpy, die das nan-Handling betreffen. Wenn das Handling nicht dem in der Doku beschriebenen Verhalten entspricht, ggf. auf der Mailingliste nachfragen, damit die Entwickler das mitbekommen - oder, wenn Du / Ihr euch sicher seid, direkt einen Bugreport schreiben. (Ich selber kann z. Zt. nicht test, da auf dem System auf dem ich arbeite, eine veraltete numpy-Version liegt.)

Gruß,
Christian
BlackJack

@CM: Ein NAN ist ungleich zu *allem* inklusive sich selbst!

Code: Alles auswählen

In [305]: np.NAN == np.NAN
Out[305]: False

In [306]: np.sqrt(-1)
Out[306]: nan

In [307]: np.Inf - np.Inf
Out[307]: nan

In [308]: np.sqrt(-1) == (np.Inf - np.Inf)
Out[308]: False
Das ist gewollt und in IEEE 754 so spezifiziert. Denn bei dem letzten Beispiel möchte man ja nicht, dass da `True` heraus kommt. :-) Deswegen braucht man eine Funktion zum Testen und kann kein ``==`` verwenden.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Punkt für Dich! :-) Schlimmer - oder besser -, wie man's nimmt, ist aber, dass ich einen Bug bei mir entdeckt habe. Das hat doch mal funktioniert ... wenn ich jetzt noch wüßte unter welchen Bedingungen mein Code vernünftig lief ... :?

Danke für die Korrektur,
Christian
Antworten