2013-06-12 16 views
7

ich eine numpy Array wie diese:ersetzen Nullen in numpy Array mit dem Medianwert

foo_array = [38,26,14,55,31,0,15,8,0,0,0,18,40,27,3,19,0,49,29,21,5,38,29,17,16] 

ich alle Nullen mit dem Medianwert des gesamten Arrays ersetzt werden soll (wobei die Null-Werte sind nicht zu bei der Berechnung des Median einbezogen werden)

Bisher habe ich diese los:

foo_array = [38,26,14,55,31,0,15,8,0,0,0,18,40,27,3,19,0,49,29,21,5,38,29,17,16] 
foo = np.array(foo_array) 
foo = np.sort(foo) 
print "foo sorted:",foo 
#foo sorted: [ 0 0 0 0 0 3 5 8 14 15 16 17 18 19 21 26 27 29 29 31 38 38 40 49 55] 
nonzero_values = foo[0::] > 0 
nz_values = foo[nonzero_values] 
print "nonzero_values?:",nz_values 
#nonzero_values?: [ 3 5 8 14 15 16 17 18 19 21 26 27 29 29 31 38 38 40 49 55] 
size = np.size(nz_values) 
middle = size/2 
print "median is:",nz_values[middle] 
#median is: 26 

gibt es einen cleveren Weg, dies mit numpy Syntax zu erreichen?

Danke

Antwort

16

Diese Lösung nutzt numpy.median:

import numpy as np 
foo_array = [38,26,14,55,31,0,15,8,0,0,0,18,40,27,3,19,0,49,29,21,5,38,29,17,16] 
foo = np.array(foo_array) 
# Compute the median of the non-zero elements 
m = np.median(foo[foo > 0]) 
# Assign the median to the zero elements 
foo[foo == 0] = m 

Nur ein Wort der Warnung, der Median für Ihr Array (ohne Nullen) 23,5 ist aber klebt wie geschrieben, in 23

+0

Warten Sie eine Minute ... Der Median sollte 26 sein? Wenn das Nicht-Null-Element-Array sortiert ist (3 5 8 14 15 16 17 18 19 21 26 27 29 29 31 38 38 40 49 55), ist der Wert in der Mitte 26. – slashdottir

+0

Nevermind, Sie haben Recht. Das ist eine gute Lösung – slashdottir

+0

Yeah, es gibt 20 Nicht-Null-Elemente. Die beiden in der Mitte sind 21 und 26. Der Median wird normalerweise als der Durchschnitt der beiden in der Mitte für eine gerade Anzahl von Elementen berechnet, so dass wir 23,5 erhalten. Danke für die Verbesserung! – bbayles

1
foo2 = foo[:] 
foo2[foo2 == 0] = nz_values[middle] 

Statt foo2, die Sie gerade foo aktualisieren können, wenn Sie wollen. Numpys intelligente Array-Syntax kann einige Zeilen des von Ihnen erstellten Codes kombinieren. Zum Beispiel statt,

nonzero_values = foo[0::] > 0 
nz_values = foo[nonzero_values] 

können Sie tun nur

nz_values = foo[foo > 0] 

Sie können in der documentation mehr über "fancy Indizierung" erfahren.

+0

so cool funktioniert super, danke! – slashdottir