3

可能重复:
在不考虑零值的情况下使用 numpy 对多个数组进行平均

我正在研究 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]

我怎样才能做到这一点?

4

2 回答 2

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(屏蔽数组)的解决方案。即,

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. ])
于 2012-11-08T11:43:23.013 回答
1
  1. 从列表开始(您也可以使用None's 而不是0's)

    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)]
    
于 2012-11-08T11:49:27.577 回答