2009-06-07 2 views
22

Я хотел бы вычислить среднее массива в Python в таком виде:Как использовать numpy с значением «None» в Python?

Matrice = [1, 2, None] 

Я просто хотел, чтобы мой None значение игнорируется при расчете numpy.mean но я не могу понять, как сделай это.

+2

+1: этот вопрос может быть особенно актуально для массивов, которые импортируются из базы данных, где значения могут иногда быть NULL. – EOL

ответ

10

Вы разыскиваете для masked arrays. Вот пример.

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

К сожалению, замаскированные массивы не полностью поддерживаются в NumPy, так что вы должны смотреть вокруг, чтобы увидеть, что может и не может быть сделано с ними.

+2

участник функция, которая помогла много, была «заполнена». который вернул маскированный массив в нормальный массив, заполненный значением, которое я бы признал недействительным (NaN, -9999, независимо от ваших пользователей). – mariotomo

+0

Производительность маскированных массивов также значительно меньше, чем обычные массивы numpy, поскольку реализация представляет собой чистый Python. Если вы имеете дело с большими данными, имейте в виду последствия для производительности. – timbo

3

не использовал NumPy, но в стандартном питона вы можете отфильтровать None используя списковые или функцию фильтра

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

, а затем усреднить результат игнорировать None

+4

'x! = None' обычно записывается' x is not None' (PEP 8: «Сравнение с одиночными точками, такими как None, всегда должно выполняться с помощью« is »или« is not », а не операторов равенства.») – EOL

3

Возможно, вы также сможете использовать kludge со значениями, такими как NaN или 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]) 

Собственно, это может быть даже не клопик. Wikipedia says:

NaNs могут использоваться для представления недостающих значений в вычислениях.

На самом деле, это не работает для функции mean(), хотя, так что неразумно. :)

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

На самом деле, 'mean (a [~ isnan (a)])' явно выбирает все значения, отличные от NaN. – u0b34a0f6ae

+1

@kaizer Ваш комментарий - жемчужина. большое решение, спасибо! – Agos

1

Вы также можете использовать фильтр, не передаете Нет для него, он будет фильтровать не Истинные объекты, а также 0,: D Таким образом, использовать его, когда вам не нужно 0 тоже.

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

Вы можете использовать SciPy для этого:

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

Спасибо, это то, что мне нужно! – max

+1

Это не работает. 'a = [1,2, None]', а затем 'st.nanmean (a)' приводит к TypeError. – Nate

+1

Да, вы правы, он работает на numpy.nan, а не на None. Это наиболее полезно при вычислении среднего значения для вектора numpy. –

Смежные вопросы