2014-11-14 64 views
2

我有一个问题让我困惑不已,最后几天。我想平均不同的蒙面数组,但它似乎我不能,因为我的映射数组不具有相同的地图模式。在python中平均多个蒙版numpy数组

例如。我有三个数组:

[ -- -- --] 
[ 1. 2. --] 
[ 2. 3. --] 
[ -- -- --] 

[ -- 2. 2.] 
[ -- 2. 3.] 
[ -- -- --] 
[ -- -- --] 

[ 2 1. --] 
[ 1 1. --] 
[ -- -- --] 
[ -- -- --] 

我想要得到的结果是这些阵列的平均水平,但与一个有效的元素一个蒙面元素的平均不应该考虑蒙面元素。这意味着在(0,0)位置我有两个蒙面元素和一个有效(值= 2),所以最终结果应该只计算有效元素的平均值。

[ 2 1.5 2] 
[ 1 2 3] 
[ 2 -- --] 
[ -- -- --] 

我有28列和他们一样,我想结合,到目前为止,我所要做复杂的循环和行动,以达到预期的效果。有没有有效的方法来做到这一点?

+1

['a.mean(axis = 0)'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.ma.mean.html#numpy.ma.mean)不起作用? – Evert 2014-11-14 13:42:06

+0

所有的阵列都有相同的大小。对不起,它在数组一中是错误的。 – Numby 2014-11-14 13:57:08

+0

@Evert不,它不工作,当我尝试,例如: (array1 + array2 + array3).mean(axis = 0) 然后我只得到在每个数组中有效的元素的意思。 – Numby 2014-11-14 14:03:20

回答

1

可以将其转化为3-d屏蔽数组,然后取平均值沿axis=0,例如:

np.ma.array((a, b, c)).mean(axis=0) 

实施例:

import numpy as np 

a = np.ma.array([[99, 99, 99], 
       [ 1., 2., 99], 
       [ 2., 3., 99], 
       [99, 99, 99]], 
       mask=[[True, True, True], 
         [False, False, True], 
         [False, False, True], 
         [True, True, True]]) 
b = np.ma.array([[99, 2., 2.], 
       [99, 2., 3.], 
       [99, 99, 99], 
       [99, 99, 99]], 
       mask=[[True, False, False], 
         [True, False, False], 
         [True, True, True], 
         [True, True, True]]) 
c = np.ma.array([[2., 1., 99], 
       [1., 1., 99], 
       [99, 99, 99], 
       [99, 99, 99]], 
       mask=[[False, False, True], 
         [False, False, True], 
         [True, True, True], 
         [True, True, True]]) 

和:

np.ma.array((a, b, c)).mean(axis=0) 

masked_array(data = 
[[2.0 1.5 2.0] 
[1.0 1.6666666666666667 3.0] 
[2.0 3.0 --] 
[-- -- --]], 
      mask = 
[[False False False] 
[False False False] 
[False False True] 
[ True True True]], 
     fill_value = 1e+20) 
+1

感谢Saullo!这工作正如我所愿:) – Numby 2014-11-14 14:29:45

+0

@Numby欢迎您,不要忘记你可以upvote答案;) – 2015-01-16 12:02:12