web-dev-qa-db-fra.com

remplacer les zéros dans le tableau numpy par la valeur médiane

J'ai un tableau numpy comme celui-ci:

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]

Je veux remplacer tous les zéros par la valeur médiane de l'ensemble du tableau (où les valeurs nulles ne doivent pas être incluses dans le calcul de la médiane)

Jusqu'à présent, j'ai ceci en cours:

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

Existe-t-il un moyen intelligent d'y parvenir avec la syntaxe numpy?

Je vous remercie

17
slashdottir

Cette solution tire parti de 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

Juste une note de prudence, la médiane de votre tableau (sans zéros) est de 23,5 mais, comme écrit, cela reste en 23.

29
bbayles
foo2 = foo[:]
foo2[foo2 == 0] = nz_values[middle]

Au lieu de foo2, vous pouvez simplement mettre à jour foo si vous le souhaitez. La syntaxe de tableau intelligent de Numpy peut combiner quelques lignes du code que vous avez créé. Par exemple, au lieu de,

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

Tu peux juste faire

nz_values = foo[foo > 0]

Vous pouvez en savoir plus sur "l'indexation de fantaisie" dans la documentation .

4
Alex Szatmary