0

たとえば、次のように、複数の次元にわたって 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

できれば通常の配列と同じくらい簡単に、複数の軸でマスクされた配列の平均を計算するにはどうすればよいですか?

(この回答で提案されているように、新しい関数を定義することを意味しないソリューションを使用したいと思います。)

4

2 に答える 2

0

mean の前に形状を変更できます。

>>>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 を使用できます。

于 2016-04-20T15:48:16.777 に答える