2016-04-20 6 views
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 

Как я могу вычислить среднее замаскированного массива по множественным оси, предпочтительно так просто, как это было бы для нормального массив?

(я предпочел бы использовать решение, которое не подразумевает определение новой функции, как это было предложено в this answer.)

+0

Вы пробовали 'ma.mean (2) .mean (1)'? – wflynny

+0

@wflynny: Этот ответ должен работать. В случае, если он хочет только вычислить среднее значение «не-маскированных значений». – fuuman

+0

Для получения дополнительной информации о том, что индексирование кортежа не выполняется, см. [Этот вопрос] (http://stackoverflow.com/questions/30209624/numpy-mean-used-with-a-tuple-as-axis-argument-not-working -with-a-masked-arr) тоже. – mtzl

ответ

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. Но пока это работает, я не буду жаловаться!

0

Вы можете изменить его до среднего значения:

>>>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 раньше.