2014-06-14 4 views
5

Ich habe ein 1D-Array und ich möchte numpy bincount verwenden, um ein Histogramm zu erstellen. Es funktioniert OK, aber Ich möchte es NaN-Werte ignorieren.Ignore NaN in numpy bincount in Python

histogram = np.bincount(distancesArray, weights=intensitiesArray)/np.bincount(distancesArray) 

Wie kann ich das tun?

Danke für Ihre Hilfe!

Antwort

5

Hier ist, was ich denke, Ihr Problem ist:

import numpy 

w = numpy.array([0.3, float("nan"), 0.2, 0.7, 1., -0.6]) # weights 
x = numpy.array([0, 1, 1, 2, 2, 2]) 
numpy.bincount(x, weights=w) 
#>>> array([ 0.3, nan, 1.1]) 

Die Lösung nur Indizierung nur zu verwenden ist, um die nicht-nan Gewichte zu halten:

keep = ~numpy.isnan(w) 
numpy.bincount(x[keep], weights=w[keep]) 
#>>> array([ 0.3, 0.2, 1.1]) 
2

Sie können nicht NaN in einer ganzen Zahl haben bewertet Array. Wenn Sie versuchen, np.bincount zu nennen, wird es gehen beschweren:

TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe' 

Wenn Sie das Gießen (.astype(int)) tun, werden Sie verrückt Werte erhalten, wie -9223372036854775808. Sie können dies überwinden, indem die nicht NaN-Werte auswählen:

mask = ~np.logical_or(np.isnan(distancesArray), np.isnan(intensitiesArray)) 
histogram = np.bincount(distancesArray[mask].astype(int), 
         weights=intensitiesArray[mask]) 
0

Sie es zu einem Pandas Serie umwandeln konnte und die Nullwerte entfernen.

ds = pd.Series(distancesArray) 
ds = ds[ds.notnull()] #returns non nullvalues