Reputation:
I'd like to calculate the mean of an array in Python in this form:
Matrice = [1, 2, None]
I'd just like to have my None
value ignored by the numpy.mean
calculation but I can't figure out how to do it.
Upvotes: 33
Views: 51155
Reputation: 69242
You are looking for masked arrays. Here's an example.
import numpy.ma as ma
a = ma.array([1, 2, None], mask = [0, 0, 1])
print "average =", ma.average(a)
From the numpy docs linked above, "The numpy.ma module provides a nearly work-alike replacement for numpy that supports data arrays with masks."
Upvotes: 12
Reputation: 839
You can 'upcast' the array to numpy's float64 dtype and then use numpy's nanmean method as in the following example:
import numpy as np
arr = [1,2,3, None]
arr2 = np.array(arr, dtype=np.float64)
print(arr2) # [ 1. 2. 3. nan]
print(np.nanmean(arr2)) # 2.0
Upvotes: 4
Reputation: 4632
You can use scipy for that:
import scipy.stats.stats as st
m=st.nanmean(vec)
Upvotes: 6
Reputation: 26823
You might also be able to kludge with values like NaN or 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])
Actually, it might not even be a kludge. Wikipedia says:
NaNs may be used to represent missing values in computations.
Actually, this doesn't work for the mean() function, though, so nevermind. :)
In [20]: mean([1, 2, NaN])
Out[20]: nan
Upvotes: 4
Reputation: 123881
You can also use filter, pass None to it, it will filter non True objects, also 0, :D So, use it when you dont need 0 too.
>>> filter(None,[1, 2, None])
[1, 2]
Upvotes: 3
Reputation: 70763
haven't used numpy, but in standard python you can filter out None
using list comprehensions
or the filter function
>>> [i for i in [1, 2, None] if i != None]
[1, 2]
>>> filter(lambda x: x != None, [1, 2, None])
[1, 2]
and then average the result to ignore the None
Upvotes: 7