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])