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
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.
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 .