2012-11-08 69 views
3

可能重复:
avarage of a number of arrays with numpy without considering zero values与零均值阵列值

我在numpy的工作,我有许多相同大小和形状的阵列。他们是500 * 500。它有一些空值。我想要一个数组,它是我的原始数组的平均值。例如:

A=[ 1 Null 8 Null; Null 4 6 1] 
B=[ 8 5 8 Null; 5 9 5 3] 

结果数组应该是这样的:

C=[ 4.5 5 8 Null; 5 6.5 5.5 2] 

我怎么能这样做?

+1

到底是'Null'的是什么? – NPE

+3

不,我的意思是在Python/NumPy中没有叫'Null'的东西。它是'numpy.nan','None'还是什么? – NPE

回答

6

更新:自NumPy 1.8起,您可以使用np.nanmean而不是scipy.stats.nanmean


如果你有scipy,你可以使用scipy.stats.nanmean

In [2]: import numpy as np 

In [45]: import scipy.stats as stats 

In [3]: nan = np.nan 

In [43]: A = np.array([1, nan, 8, nan, nan, 4, 6, 1]) 
In [44]: B = np.array([8, 5, 8, nan, 5, 9, 5, 3]) 
In [46]: C = np.array([A, B])  
In [47]: C 
Out[47]: 
array([[ 1., nan, 8., nan, nan, 4., 6., 1.], 
     [ 8., 5., 8., nan, 5., 9., 5., 3.]]) 

In [48]: stats.nanmean(C) 
Warning: invalid value encountered in divide 
Out[48]: array([ 4.5, 5. , 8. , nan, 5. , 6.5, 5.5, 2. ]) 

你可以找到其他numpy的只(屏蔽阵列)解决方案,here。也就是说,

In [60]: C = np.array([A, B])  
In [61]: C = np.ma.masked_array(C, np.isnan(C))  
In [62]: C 
Out[62]: 
masked_array(data = 
[[1.0 -- 8.0 -- -- 4.0 6.0 1.0] 
[8.0 5.0 8.0 -- 5.0 9.0 5.0 3.0]], 
      mask = 
[[False True False True True False False False] 
[False False False True False False False False]], 
     fill_value = 1e+20) 

In [63]: np.mean(C, axis = 0) 
Out[63]: 
masked_array(data = [4.5 5.0 8.0 -- 5.0 6.5 5.5 2.0], 
      mask = [False False False True False False False False], 
     fill_value = 1e+20) 

In [66]: np.ma.filled(np.mean(C, axis = 0), nan) 
Out[67]: array([ 4.5, 5. , 8. , nan, 5. , 6.5, 5.5, 2. ]) 
+2

'np.ma'的一个优点是它可以处理整型数组,而'nan ...'函数需要浮点数组作为输入。 –

+1

@PierreGM:啊是的,因为在整数数组中不允许使用np.nan。感谢您指出了这一点。 – unutbu

+0

如果你没有scipy,还有[numpy.nanmean](http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.nanmean.html)。 – rjf

1
  1. 从列表中开始像(你也可以有None的,而不是0的)

    A = [1, 0, 8, 0, 0, 4, 6, 1] 
    B = [8, 5, 8, 0, 5, 9, 5, 3] 
    
  2. 那么你应该有这样的列表:

    lst = [A, B] 
    
  3. 定义一个函数来计算数字列表的均值:

    def mean(nums): 
        return float(sum(nums))/len(nums) if nums else 0 
    
  4. 最后,你可以用这种方法计算平均:

    C = [mean(filter(None, col)) for col in zip(*list)]