2013-09-17 1 views
0

Я маскирую свой массив, где значения являются nodata (-9999), вычисляют среднее значение по оси = 0, а затем разоблачают мой массив данных, но тогда мои значения нодата меняются на 0, но теперь, как провести различие между «рассчитанными средними 0» и «nodata 0's». См следующий пример кода:Размаскивание маскированных массивов Numpy изменяет маскированные значения на 0

In [1]: import numpy.ma as ma 
    ...: x = [[0.,1.,-9999.,3.,4.],[0.,2.,-9999,4.,5.]] 
    ...: x 
Out[1]: [[0.0, 1.0, -9999.0, 3.0, 4.0], [0.0, 2.0, -9999, 4.0, 5.0]] 

In [2]: mx = ma.masked_values(x, -9999.) 
    ...: mx 
Out[2]: 
masked_array(data = 
[[0.0 1.0 -- 3.0 4.0] 
[0.0 2.0 -- 4.0 5.0]], 
      mask = 
[[False False True False False] 
[False False True False False]], 
     fill_value = -9999.0) 

In [3]: mean = mx.mean(axis=0) 
    ...: mean 
Out[3]: 
masked_array(data = [0.0 1.5 -- 3.5 4.5], 
      mask = [False False True False False], 
     fill_value = 1e+20) 

In [4]: mean.mask = ma.nomask 
    ...: mean 
Out[4]: 
masked_array(data = [0.0 1.5 0.0 3.5 4.5], 
      mask = [False False False False False], 
     fill_value = 1e+20) 

Но я хотел бы иметь результат, похожий на мой вход, с NoData значениями, -9999, как:.

In [4]: mean.mask = ma.nomask 
    ...: mean 
Out[4]: 
masked_array(data = [0.0 1.5 -9999. 3.5 4.5], 
      mask = [False False False False False], 
     fill_value = 1e+20) 

ответ

4
>>> mean = mx.mean(axis=0) 
>>> mean[mean.mask] = mx.fill_value 
>>> mean 
masked_array(data = [0.0 1.5 -9999.0 3.5 4.5], 
      mask = [False False False False False], 
     fill_value = 1e+20) 
+0

Вот оно! Благодаря! Я могу принять ваш ответ в течение 30 секунд. – Mattijn

+0

@Mattijn На самом деле вам даже не нужно 'mean.mask = ma.nomask', так как присвоение маскированному значению автоматически устанавливает маску на' False'. Обновлен ответ. –

+0

OK, спасибо за обновление! – Mattijn