Search code examples
pythonnumpymatrixmaskmasked-array

How to properly mask a numpy 2D array?


Say I have a two dimensional array of coordinates that looks something like

x = array([[1,2],[2,3],[3,4]])

Previously in my work so far, I generated a mask that ends up looking something like

mask = [False,False,True]

When I try to use this mask on the 2D coordinate vector, I get an error

newX = np.ma.compressed(np.ma.masked_array(x,mask))

>>>numpy.ma.core.MaskError: Mask and data not compatible: data size 
   is 6, mask size is 3.`

which makes sense, I suppose. So I tried to simply use the following mask instead:

mask2 = np.column_stack((mask,mask))
newX = np.ma.compressed(np.ma.masked_array(x,mask2))

And what I get is close:

>>>array([1,2,2,3])

to what I would expect (and want):

>>>array([[1,2],[2,3]])

There must be an easier way to do this?


Solution

  • Is this what you are looking for?

    import numpy as np
    x[~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)