Select elements of numpy array via boolean mask array
You probably want something like this:
>>> a = np.array([True, True, True, False, False])>>> b = np.array([[1,2,3,4,5], [1,2,3,4,5]])>>> b[:,a]array([[1, 2, 3], [1, 2, 3]])
Note that for this kind of indexing to work, it needs to be an ndarray
, like you were using, not a list
, or it'll interpret the False
and True
as 0
and 1
and give you those columns:
>>> b[:,[True, True, True, False, False]] array([[2, 2, 2, 1, 1], [2, 2, 2, 1, 1]])
Hope I'm not too late! Here's your array:
X = np.array([[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]])
Let's create an array of zeros of the same shape as X
:
mask = np.zeros_like(X)# array([[0, 0, 0, 0, 0],# [0, 0, 0, 0, 0]])
Then, specify the columns that you want to mask out or hide with a 1
. In this case, we want the last 2 columns to be masked out.
mask[:, -2:] = 1# array([[0, 0, 0, 1, 1],# [0, 0, 0, 1, 1]])
Create a masked array:
X_masked = np.ma.masked_array(X, mask)# masked_array(data=[[1, 2, 3, --, --],# [1, 2, 3, --, --]],# mask=[[False, False, False, True, True],# [False, False, False, True, True]],# fill_value=999999)
We can then do whatever we want with X_masked
, like taking the sum of each column (along axis=0
):
np.sum(X_masked, axis=0)# masked_array(data=[2, 4, 6, --, --],# mask=[False, False],# fill_value=1e+20)
Great thing about this is that X_masked
is just a view of X
, not a copy.
X_masked.base is X# True