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
numpy nan add
Du suchst masked arrays.
Also sowas wie:
Also sowas wie:
Code: Alles auswählen
array2 = numpy.ma.array(array1, mask=array1 == numpy.NAN) + 30
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.)sophy hat geschrieben:Nur noch zur Info: Die Identifikation von NaNs funktioniert nur folgendermassen:
array2=numpy.ma.array(array1,mask=numpy.isnan(array1))
Gruß,
Christian
@CM: Ein NAN ist ungleich zu *allem* inklusive sich selbst!
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.
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
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
Danke für die Korrektur,
Christian