How to properly mask a numpy 2D array? How to properly mask a numpy 2D array? numpy numpy

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)