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"