具有Null值的平均数组

时间:2012-11-08 11:29:36

标签: python arrays numpy null average

  

可能重复:
  avarage of a number of arrays with numpy without considering zero values

我正在研究numpy,我有许多具有相同大小和形状的数组。它们是500 * 500。它有一些Null值。我希望有一个数组,它是我原始数组的逐个元素平均值的结果。例如:

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]

我该怎么做?

2 个答案:

答案 0 :(得分: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. ])

答案 1 :(得分: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)]