Почему np.ma.array принимает инвертированную маску? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть некоторый массив

a = np.array([1, 2, 3])

и некоторая маска

mask = np.ones(a.shape, dtype=bool)

и могу сделать

np.testing.assert_almost_equal(a[mask], a)  # True

Однако

np.ma.array(a, mask)

эквивалентно

a[np.logical_not(mask)]

, а

np.ma.array(a, np.logical_not(mask))

эквивалентно

a[mask]

Это кажется мне нелогичным. .

Хотелось бы получить объяснение этого выбора дизайна от numpy.

1 Ответ

0 голосов
/ 28 мая 2020
In [6]: a = np.array([1,2,3])                                                            
In [7]: idx = np.array([1,0,1], bool)                                                    
In [8]: idx                                                                              
Out[8]: array([ True, False,  True])
In [9]: a[idx]                                                                           
Out[9]: array([1, 3])

Тот факт, что вы вызвали логический массив mask, не означает, что он ведет себя как «маска» во всех смыслах этого слова. Я намеренно выбрал другое имя. Да, мы часто называем такой массив mask и говорим о «маскировании», но на самом деле мы делаем «выбор». Операции a[idx] возвращают элементы a, где idx - True. Это то же самое, что и индексация с кортежем nonzero:

In [13]: np.nonzero(idx)                                                                 
Out[13]: (array([0, 2]),)

In np.ma маска используется в смысле «маскировать», закрывая.

In [10]: mm = np.ma.masked_array(a, mask=idx)                                            
In [11]: mm                                                                              
Out[11]: 
masked_array(data=[--, 2, --],
             mask=[ True, False,  True],
       fill_value=999999)
In [12]: mm.compressed()                                                                 
Out[12]: array([2])

In на дисплее маскированные значения отображаются как '-'. Как говорится в документации np.ma, эти элементы считаются недопустимыми и будут исключены из вычислений.

mm.filled возвращает массив с «замаскированным» значением, замененным на «заполнить»:

In [16]: mm.filled()                                                                     
Out[16]: array([999999,      2, 999999])

мы можем сделать то же самое с idx:

In [17]: a[idx] = 999999                                                                 
In [18]: a                                                                               
Out[18]: array([999999,      2, 999999])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...