Python 多维平均numpy屏蔽阵列

Python 多维平均numpy屏蔽阵列,python,numpy,masked-array,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

可以在多个维度上计算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
>>将numpy作为np导入
>>>a=np.random.randint(0,10,(2,2,2))
>>>a
数组([[0,9],
[2, 5]],
[[8, 6],
[0, 7]]])
>>>a.平均值(轴=(1,2))
数组([4,5.25])
>>>ma=np.ma.array(a,掩码=(a<5))
>>>平均值(轴=(1,2))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.7/site packages/numpy/ma/core.py”,第5066行,平均值
cnt=自身计数(轴=轴)
文件“/usr/lib/python2.7/site packages/numpy/ma/core.py”,第4280行,计数
n1=np.尺寸(m,轴)
文件“/usr/lib/python2.7/site packages/numpy/core/fromneric.py”,第2700行,大小
返回a.shape[轴]
TypeError:元组索引必须是整数,而不是元组
如何计算屏蔽阵列在多轴上的平均值,最好与普通阵列一样简单


(我宁愿使用一种不意味着定义新函数的解决方案,如中所述。)

您可以在平均值之前对其进行重塑:

>>>ma.reshape(mc.shape[0],-1).mean(1)
masked_array(data = [1.6666666666666667 4.0],
         mask = [False False],
         fill_value = 1e+20)
请注意,部分应用平均值会导致不明确的结果:

>>> ma.mean(1).mean(1)
masked_array(data = [1.5 4.0],
             mask = [False False],
       fill_value = 1e+20)


>>> ma.mean(2).mean(1)
masked_array(data = [2.25 4.0],
             mask = [False False],
       fill_value = 1e+20)
解释如下:

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

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

 [[ True  True]
  [ True False]]],
       fill_value = 999999)
在每种情况下,重量都不相同


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

可以在平均值之前对其进行重塑:

>>>ma.reshape(mc.shape[0],-1).mean(1)
masked_array(data = [1.6666666666666667 4.0],
         mask = [False False],
         fill_value = 1e+20)
请注意,部分应用平均值会导致不明确的结果:

>>> ma.mean(1).mean(1)
masked_array(data = [1.5 4.0],
             mask = [False False],
       fill_value = 1e+20)


>>> ma.mean(2).mean(1)
masked_array(data = [2.25 4.0],
             mask = [False False],
       fill_value = 1e+20)
解释如下:

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

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

 [[ True  True]
  [ True False]]],
       fill_value = 999999)
在每种情况下,重量都不相同


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

我发现尽管
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
的包装。但只要它起作用,我就不会抱怨

我发现尽管
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
的包装。但只要它起作用,我就不会抱怨

你试过
ma.mean(2)。mean(1)
?@wflynny:这个答案应该有用。在这种情况下,他只想计算“未屏蔽值”的平均值。有关未实现元组索引的更多详细信息,请参见。@wflynny:这是我的第一个猜测,但它改变了每个值的权重。在前面的示例中,它返回
[7,7.25]
,而不是它应该返回的
[7,7]
。(另外,应该是
ma.mean(1).mean(1)
)你试过
ma.mean(2).mean(1)
?@wflynny:这个答案应该行得通。在这种情况下,他只想计算“未屏蔽值”的平均值。有关未实现元组索引的更多详细信息,请参见。@wflynny:这是我的第一个猜测,但它改变了每个值的权重。在前面的示例中,它返回
[7,7.25]
,而不是它应该返回的
[7,7]
。(另外,它将是
ma.平均值(1).平均值(1)