在多个维度上平均numpy蒙版数组

时间:2016-04-20 15:15:38

标签: python numpy masked-array

可以在多个维度上计算numpy数组的平均值,例如。 my_ndarray.mean(axis=(1,2))

但是,它似乎不适用于蒙版数组

>>> import numpy as np
>>> a = np.random.randint(0, 10, (2, 2, 2))
>>> a
array([[[0, 9],
        [2, 5]],

       [[8, 6],
        [0, 7]]])
>>> a.mean(axis=(1, 2))
array([ 4.  ,  5.25])
>>> ma = np.ma.array(a, mask=(a < 5))
>>> ma.mean(axis=(1, 2))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/numpy/ma/core.py", line 5066, in mean
    cnt = self.count(axis=axis)
  File "/usr/lib/python2.7/site-packages/numpy/ma/core.py", line 4280, in count
    n1 = np.size(m, axis)
  File "/usr/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 2700, in size
    return a.shape[axis]
TypeError: tuple indices must be integers, not tuple

如何计算多轴上遮罩阵列的平均值,最好像普通阵列那样简单?

(我宁愿使用一种不暗示定义新功能的解决方案,如this answer中所提议的那样。)

2 个答案:

答案 0 :(得分:2)

我发现虽然np.ma.mean不起作用,np.ma.average会给出预期结果:

>>> np.ma.average(ma, axis=(1,2))
masked_array(data = [7.0 7.0],
             mask = [False False],
       fill_value = 1e+20)

这很令人困惑,因为对于常规数组,np.average仅仅是np.mean的包装。但只要它有效,我就不会抱怨!

答案 1 :(得分:0)

你可以在平均值之前重塑它:

>>>ma
masked_array(data =
 [[[0 1]
  [4 --]]

 [[-- --]
  [-- 4]]],
             mask =
 [[[False False]
  [False  True]]

 [[ True  True]
  [ True False]]],
       fill_value = 999999)

请注意,部分应用平均会导致模糊结果:

{{1}}

解释:

{{1}}

每种情况下的权重都不相同。

要在其他维度上取平均值,您可以在之前使用np.rollaxis。