Seite 1 von 1

numpy nan add

Verfasst: Mittwoch 13. Januar 2010, 12:58
von sophy
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

Verfasst: Mittwoch 13. Januar 2010, 13:34
von Darii
Du suchst masked arrays.

Also sowas wie:

Code: Alles auswählen

array2 = numpy.ma.array(array1, mask=array1 == numpy.NAN) + 30

Verfasst: Mittwoch 13. Januar 2010, 14:23
von sophy
Super, das funktioniert tatsächlich auf Anhieb! Werd mich da direkt mal einlesen was man da so alles mit machen kann. Vielen Dank!

Verfasst: Dienstag 19. Januar 2010, 10:17
von sophy
Nur noch zur Info: Die Identifikation von NaNs funktioniert nur folgendermassen:

array2=numpy.ma.array(array1,mask=numpy.isnan(array1))

Verfasst: Dienstag 19. Januar 2010, 12:57
von CM
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

Verfasst: Dienstag 19. Januar 2010, 16:40
von 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.

Verfasst: Dienstag 19. Januar 2010, 16:49
von CM
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