How to properly mask a numpy 2D array?
Is this what you are looking for?
import numpy as npx[~np.array(mask)]# array([[1, 2],# [2, 3]])
Or from numpy masked array:
newX = np.ma.array(x, mask = np.column_stack((mask, mask)))newX# masked_array(data =# [[1 2]# [2 3]# [-- --]],# mask =# [[False False]# [False False]# [ True True]],# fill_value = 999999)
Your x
is 3x2:
In [379]: xOut[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 stackIn [394]: xmaskOut[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)
With np.where
you can do all sorts of things:
x_maskd = np.where(mask, x, 0)