我正在研究 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]
我怎样才能做到这一点?
更新:从 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. ])
从列表开始(您也可以使用None
's 而不是0
's)
A = [1, 0, 8, 0, 0, 4, 6, 1]
B = [8, 5, 8, 0, 5, 9, 5, 3]
然后你应该有一个类似的列表:
lst = [A, B]
定义一个函数来计算数字列表的平均值:
def mean(nums):
return float(sum(nums)) / len(nums) if nums else 0
最后,您可以通过这种方式计算平均值:
C = [mean(filter(None, col)) for col in zip(*list)]