可能重复:
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]
我该怎么做?
答案 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)
从列表开始(您也可以None
代替0
)
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)]