具有Null值的平均数组

f.a*_*uri 3 python arrays null numpy average

可能重复:
使用numpy的多个数组的avarage而不考虑零值

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

A=[ 1 Null 8 Null; Null 4 6 1]
B=[ 8 5 8 Null; 5 9 5 3]
Run Code Online (Sandbox Code Playgroud)

结果数组应该是这样的:

C=[ 4.5 5 8 Null; 5 6.5 5.5 2]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

unu*_*tbu 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. ])
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到其他仅限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. ])
Run Code Online (Sandbox Code Playgroud)

  • `np.ma`的一个优点是它适用于整数数组,而`nan ...`函数需要浮点数作为输入. (2认同)