2009-06-07 7 views
22

Je voudrais calculer la moyenne d'un tableau en Python sous cette forme:Comment utiliser numpy avec la valeur 'None' en Python?

Matrice = [1, 2, None] 

Je voudrais simplement avoir ma valeur None ignorée par le calcul numpy.mean, mais je ne peux pas comprendre comment fais le.

+2

+1: cette question peut être particulièrement pertinent pour les tableaux qui sont importés à partir d'une base de données, où les valeurs peuvent parfois être NULL. – EOL

Répondre

10

Vous êtes à la recherche pour masked arrays. Voici un exemple.

import MA 
a = MA.array([1, 2, None], mask = [0, 0, 1]) 
print "average =", MA.average(a) 

Malheureusement, les tableaux masqués ne sont pas bien pris en charge dans numpy, de sorte que vous avez à regarder autour de voir ce qui peut et ne peut pas être fait avec eux.

+2

un membre la fonction qui a beaucoup aidé a été «remplie». qui a ramené le tableau masqué à un tableau normal, rempli d'une valeur que je reconnais comme invalide (NaN, -9999, tout ce dont vos utilisateurs ont besoin). – mariotomo

+0

La performance des tableaux masqués est également significativement moindre que celle des tableaux numériques réguliers car l'implémentation est pure en Python. Si vous avez affaire à des données volumineuses, soyez conscient des implications sur les performances. – timbo

3

n'ont pas utilisé numpy, mais en python standard, vous pouvez filtrer None comprehensions liste ou la fonction de filtre

>>> [i for i in [1, 2, None] if i != None] 
[1, 2] 
>>> filter(lambda x: x != None, [1, 2, None]) 
[1, 2] 

et en moyenne le résultat d'ignorer la None

+4

'x! = None' s'écrit habituellement' x is not None' (PEP 8: "Les comparaisons avec des singletons comme None doivent toujours être faites avec 'is' ou 'is not', jamais les opérateurs d'égalité.") – EOL

3

Vous pourriez aussi être en mesure de kludge avec des valeurs comme NaN ou Inf.

In [1]: array([1, 2, None]) 
Out[1]: array([1, 2, None], dtype=object) 

In [2]: array([1, 2, NaN]) 
Out[2]: array([ 1., 2., NaN]) 

En fait, il pourrait même ne pas être un kludge. Wikipedia says:

NaNs peuvent être utilisés pour représenter des valeurs manquantes dans les calculs.

En fait, cela ne fonctionne pas pour la fonction mean(), donc, nevermind. :)

In [20]: mean([1, 2, NaN]) 
Out[20]: nan 
+6

En fait, 'mean (a [~ isnan (a)])' qui choisit explicitement toutes les valeurs non-NaN fonctionne. – u0b34a0f6ae

+1

@kaizer votre commentaire est un petit bijou. bonne solution, merci! – Agos

1

Vous pouvez également utiliser le filtre, passe à aucun, il filtrera non des objets vrais, aussi 0,: D Alors, utilisez-le lorsque vous ne avez pas besoin 0 aussi.

>>> filter(None,[1, 2, None]) 
[1, 2] 
6

Vous pouvez utiliser scipy pour que:

import scipy.stats.stats as st 
m=st.nanmean(vec) 
+0

Merci, c'est exactement ce dont j'avais besoin! – max

+1

Cela ne fonctionne pas. 'a = [1,2, None]', puis 'st.nanmean (a)' aboutit à une erreur TypeError. – Nate

+1

Oui, vous avez raison, cela fonctionne sur numpy.nan, pas sur None. C'est très utile pour calculer la moyenne sur un vecteur numpy. –

Questions connexes