заменить маску с нан в numpy masked_array - PullRequest
1 голос
/ 20 мая 2019
>> masks = [[1,1],[0,0]]    
>> [np.ma.masked_array(data=np.array([1.0,2.0]), mask=m, fill_value=np.nan).mean() for m in masks]
   [masked, 1.5]

Я бы хотел заменить результат masked на nan. Есть ли способ сделать это напрямую с помощью numpy's masked_array?

Ответы [ 2 ]

2 голосов
/ 20 мая 2019
In [232]: M = np.ma.masked_array(data=np.array([1.0,2.0]),mask=[True, False])

filled метод заменяет маскированные значения значением заполнения:

In [233]: M.filled()                                                         
Out[233]: array([1.e+20, 2.e+00])
In [234]: M.filled(np.nan)         # or with a value of your choice.                                                   
Out[234]: array([nan,  2.])

Или, как вы делаете, укажите значение заполнения при определении массива:

In [235]: M = np.ma.masked_array(data=np.array([1.0,2.0]),mask=[True, False],
     ...:  fill_value=np.nan)                                                
In [236]: M                                                                  
Out[236]: 
masked_array(data=[--, 2.0],
             mask=[ True, False],
       fill_value=nan)
In [237]: M.filled()                                                         
Out[237]: array([nan,  2.])

Метод маскированного среднего пропускает заполненные значения:

In [238]: M.mean()                                                           
Out[238]: 2.0
In [239]: M.filled().mean()                                                  
Out[239]: nan
In [241]: np.nanmean(M.filled())    # so does the `nanmean` function
In [242]: M.data.mean()             # mean of the underlying data                                                      
Out[242]: 1.5
0 голосов
/ 20 мая 2019

Я думаю, что вы можете сделать np.ones

masks=np.array([[1,1],[0,0]])

np.ma.masked_array(data=np.array([1.0,2.0])*np.ones(masks.shape), mask=masks, fill_value=np.nan).mean(axis=1)
Out[145]: 
masked_array(data=[--, 1.5],
             mask=[ True, False],
       fill_value=1e+20)
...