我有两个阵列,我想考虑它们的每单元平均值,但考虑到NaNs。
我的两个数组是:
In [267]: a = np.array([ [1, 2, np.nan], [np.nan, 5, 6], [np.nan, np.nan, np.nan]])
In [268]: a
Out[268]:
array([[ 1., 2., nan],
[ nan, 5., 6.],
[ nan, nan, nan]])
In [269]: b = np.array( [ [2, np.nan, 6], [8, np.nan, 12], [14, 16, np.nan]])
In [270]: b
Out[270]:
array([[ 2., nan, 6.],
[ 8., nan, 12.],
[ 14., 16., nan]])
如果我不想考虑NaN,那么我可以这样做:
In [271]: (a+b)/2
Out[271]:
array([[ 1.5, nan, nan],
[ nan, nan, 9. ],
[ nan, nan, nan]])
但是,我需要进行均值计算,以便忽略mean(2.5, nan) == 2.5
- 并因此忽略NaN,除非我有两个NaN,在这种情况下mean(nan, nan) == nan
。
因此,我想得到的结果是:
Out[271]:
array([[ 1.5, 2, 6],
[ 8, 5, 9. ],
[ 14, 16, nan]])
scipy.stats.nanmean
似乎是这样做的。但是,要做到这一点,我认为我需要正确堆叠数组。我有两个3 x 3阵列,我想我需要创建一个2 x 3 x 3阵列 - 是吗?我似乎无法堆叠这些数组来创建具有这些维度的结果 - 我已尝试np.dstack
以及其他各种技术,但似乎没有任何效果。
我怀疑自己在做些傻事 - 关于如何解决这个问题的想法?
答案 0 :(得分:2)
您需要跨新轴(第三维 - 轴2)连接数组。然后,您可以将nanmean
放在此维度上。
In [1]: c = np.concatenate([a[..., None], b[..., None]], axis=2)
In [2]: scipy.stats.nanmean(c, axis=2)
Out[3]:
array([[ 1.5, 2. , 6. ],
[ 8. , 5. , 9. ],
[ 14. , 16. , nan]])
答案 1 :(得分:2)
我使用np.array组合了数组:
>>> c=np.array([a,b])
array([[[ 1., 2., nan],
[ nan, 5., 6.],
[ nan, nan, nan]],
[[ 2., nan, 6.],
[ 8., nan, 12.],
[ 14., 16., nan]]])
>>> scipy.stats.nanmean(c,axis=0)
array([[ 1.5, 2. , 6. ],
[ 8. , 5. , 9. ],
[ 14. , 16. , nan]])