2009-06-07 16 views
22

me gustaría para calcular la media de un conjunto en Python en esta forma:¿Cómo usar Numpy con el valor 'Ninguno' en Python?

Matrice = [1, 2, None] 

Sólo me gustaría tener mi valor None ignorado por el cálculo numpy.mean pero no puedo encontrar la manera de hazlo.

+2

+1: esta pregunta puede ser particularmente relevante para las matrices que se importan desde una base de datos, donde los valores que a veces puede ser nulo. – EOL

Respuesta

10

Usted está buscando para masked arrays. Aquí hay un ejemplo.

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

Por desgracia, las matrices enmascarados no son compatibles a fondo en numpy, por lo que tiene que mirar alrededor para ver lo que se puede y no se puede hacer con ellos.

+2

member la función que ayudó mucho fue 'llena'. eso trajo la matriz enmascarada a una matriz normal, llena con un valor que reconocería como no válido (NaN, -9999, lo que sea que necesiten los usuarios). – mariotomo

+0

El rendimiento de las matrices enmascaradas también es significativamente menor que las matrices numpy normales, ya que la implementación es pura Python. Si está tratando con big data, tenga en cuenta las implicaciones de rendimiento. – timbo

3

no han utilizado numpy, pero en Python estándar puede filtrar None usando listas por comprensión o la función de filtro

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

y luego promediar el resultado de ignorar la None

+4

'x! = None' generalmente se escribe' x is not None' (PEP 8: "Las comparaciones con singletons como None siempre deben hacerse con 'is' o 'is not', nunca los operadores de igualdad.") – EOL

3

También es posible que pueda ejecutar kludge con valores como NaN o 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 realidad, puede que ni siquiera sea un error. Wikipedia says:

NaNs se puede utilizar para representar los valores que faltan en los cálculos.

En realidad, esto no funciona para la función mean(), sin embargo, nunca importa. :)

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

En realidad, 'mean (a [~ isnan (a)])' que elige explícitamente todos los valores que no son de NaN funciona. – u0b34a0f6ae

+1

@kaizer tu comentario es una joya. gran solución, gracias! – Agos

1

También puede utilizar el filtro, pase Ninguno a ella, va a filtrar objetos que no son verdaderos, también es 0,: D Así, usarlo cuando usted no necesita 0 también.

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

Puede utilizar scipy para ello:

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

¡Gracias, esto es justo lo que necesitaba! – max

+1

Esto no funciona. 'a = [1,2, None]' y luego 'st.nanmean (a)' da como resultado un TypeError. – Nate

+1

Sí, tienes razón, funciona en numpy.nan, no en None. Es más útil cuando se calcula la media en numpy vector. –