Your x
is 3x2:
In [379]: x
Out[379]:
array([[1, 2],
[2, 3],
[3, 4]])
Make a 3 element boolean mask:
In [380]: rowmask=np.array([False,False,True])
That can be used to select the rows where it is True, or where it is False. In both cases the result is 2d:
In [381]: x[rowmask,:]
Out[381]: array([[3, 4]])
In [382]: x[~rowmask,:]
Out[382]:
array([[1, 2],
[2, 3]])
This is without using the MaskedArray subclass. To make such array, we need a mask that matches x
in shape. There isn't provision for masking just one dimension.
In [393]: xmask=np.stack((rowmask,rowmask),-1) # column stack
In [394]: xmask
Out[394]:
array([[False, False],
[False, False],
[ True, True]], dtype=bool)
In [395]: np.ma.MaskedArray(x,xmask)
Out[395]:
masked_array(data =
[[1 2]
[2 3]
[-- --]],
mask =
[[False False]
[False False]
[ True True]],
fill_value = 999999)
Applying compressed
to that produces a raveled array: array([1, 2, 2, 3])
Since masking is element by element, it could mask one element in row 1, 2 in row 2 etc. So in general compressing
, removing the masked elements, will not yield a 2d array. The flattened form is the only general choice.
np.ma
makes most sense when there's a scattering of masked values. It isn't of much value if you want want to select, or deselect, whole rows or columns.
===============
Here are more typical masked arrays:
In [403]: np.ma.masked_inside(x,2,3)
Out[403]:
masked_array(data =
[[1 --]
[-- --]
[-- 4]],
mask =
[[False True]
[ True True]
[ True False]],
fill_value = 999999)
In [404]: np.ma.masked_equal(x,2)
Out[404]:
masked_array(data =
[[1 --]
[-- 3]
[3 4]],
mask =
[[False True]
[ True False]
[False False]],
fill_value = 2)
In [406]: np.ma.masked_outside(x,2,3)
Out[406]:
masked_array(data =
[[-- 2]
[2 3]
[3 --]],
mask =
[[ True False]
[False False]
[False True]],
fill_value = 999999)
np.where
is a line-saver ! – Flannery