Skip to content Skip to sidebar Skip to footer

Mask Out Specific Values From An Array

Example: I have an array: array([[1, 2, 0, 3, 4], [0, 4, 2, 1, 3], [4, 3, 2, 0, 1], [4, 2, 3, 0, 1], [1, 0, 2, 3, 4], [4, 3, 2, 0, 1]], dtype=in

Solution 1:

Use np.in1d that gives us a flattened mask of such matching occurrences and then reshape back to input array shape for the desired output, like so -

np.in1d(a,[2,3]).reshape(a.shape)

Note that we need to feed in the numbers to be searched as a list or an array.

Sample run -

In [5]: a
Out[5]: 
array([[1, 2, 0, 3, 4],
       [0, 4, 2, 1, 3],
       [4, 3, 2, 0, 1],
       [4, 2, 3, 0, 1],
       [1, 0, 2, 3, 4],
       [4, 3, 2, 0, 1]])

In [6]: np.in1d(a,[2,3]).reshape(a.shape)
Out[6]: 
array([[False,  True, False,  True, False],
       [False, False,  True, False,  True],
       [False,  True,  True, False, False],
       [False,  True,  True, False, False],
       [False, False,  True,  True, False],
       [False,  True,  True, False, False]], dtype=bool)

2018 Edition : numpy.isin

Use NumPy built-in np.isin (introduced in 1.13.0) that keeps the shape and hence doesn't require us to reshape afterwards -

In [153]: np.isin(a,[2,3])
Out[153]: 
array([[False,  True, False,  True, False],
       [False, False,  True, False,  True],
       [False,  True,  True, False, False],
       [False,  True,  True, False, False],
       [False, False,  True,  True, False],
       [False,  True,  True, False, False]])

Solution 2:

In [965]: np.any([x==i for i in (2,3)],axis=0)
Out[965]: 
array([[False,  True, False,  True, False],
       [False, False,  True, False,  True],
       [False,  True,  True, False, False],
       [False,  True,  True, False, False],
       [False, False,  True,  True, False],
       [False,  True,  True, False, False]], dtype=bool)

This does iterate, but if the (2,3) set is small (relative to the size of x) this is relatively fast. In fact for small arr2, np.in1d does this:

        mask = np.zeros(len(ar1), dtype=np.bool)
        for a in ar2:
            mask |= (ar1 == a)

Making a masked array from this:

In [970]: np.ma.MaskedArray(x,mask)
Out[970]: 
masked_array(data =
 [[1-- 0 -- 4]
 [04-- 1 --]
 [4-- -- 0 1]
 [4-- -- 0 1]
 [10-- -- 4]
 [4-- -- 0 1]],
             mask =
 [[FalseTrueFalseTrueFalse]
 [FalseFalseTrueFalseTrue]
 [FalseTrueTrueFalseFalse]
 [FalseTrueTrueFalseFalse]
 [FalseFalseTrueTrueFalse]
 [FalseTrueTrueFalseFalse]],
       fill_value =999999)

Solution 3:

There might be simpler ways than this. But this can be one way:

import numpy as np

a = np.array([[1, 2, 0, 3, 4],
       [0, 4, 2, 1, 3],
       [4, 3, 2, 0, 1],
       [4, 2, 3, 0, 1],
       [1, 0, 2, 3, 4],
       [4, 3, 2, 0, 1]], dtype=np.int64)

f = np.vectorize(lambda x: x in {2,3})
print f(a)

Output:

[[FalseTrueFalseTrueFalse]
 [FalseFalseTrueFalseTrue]
 [FalseTrueTrueFalseFalse]
 [FalseTrueTrueFalseFalse]
 [FalseFalseTrueTrueFalse]
 [FalseTrueTrueFalseFalse]]

Post a Comment for "Mask Out Specific Values From An Array"