【问题标题】:Averaging numpy masked array over multiple dimensions在多个维度上平均 numpy 掩码数组
【发布时间】:2016-04-20 15:15:37
【问题描述】:

可以在多个维度上计算 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 中所建议的那样。)

【问题讨论】:

  • 你试过ma.mean(2).mean(1)吗?
  • @wflynny :这个答案应该有效。以防万一,他只想计算“未屏蔽值”的平均值。
  • 有关未实现元组索引的更多详细信息,请参阅this question
  • @wflynny:这是我的第一个猜测,但它改变了赋予每个值的权重。与以前的例如。它返回 [7, 7.25] 而不是 [7, 7] 应该的。 (另外,应该是ma.mean(1).mean(1)。)

标签: python numpy masked-array


【解决方案1】:

我发现虽然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 的包装。但只要有效,我不会抱怨!

【讨论】:

    【解决方案2】:

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

    >>>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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-08
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2017-12-13
      相关资源
      最近更新 更多