Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I obtain a mask, reversing numpy.flatnonzero?

Given an arbitrary one-dimensional mask:

In [1]: import numpy as np
   ...: mask = np.array(np.random.random_integers(0,1,20), dtype=bool)
   ...: mask
Out[1]: 
array([ True, False,  True, False, False,  True, False,  True,  True,
       False,  True, False,  True, False, False,  True,  True, False,
        True,  True], dtype=bool)

We can obtain an array of the True elements of mask using np.flatnonzero:

In[2]: np.flatnonzero(mask)
Out[2]: array([ 0,  2,  5,  7,  8, 10, 12, 15, 16, 18, 19], dtype=int64)

But now how do I reverse this process and go from _2 to a mask?

like image 252
Michael Currie Avatar asked Aug 13 '15 21:08

Michael Currie


2 Answers

Create an all-false mask and then use numpy's index array functionality to assign the True entries for the mask.

In[3]: new_mask = np.zeros(20, dtype=bool)
  ...: new_mask
Out[3]: 
array([False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False], dtype=bool)

In[4]: new_mask[_2] = True
  ...: new_mask
Out[4]: 
array([ True, False,  True, False, False,  True, False,  True,  True,
       False,  True, False,  True, False, False,  True,  True, False,
        True,  True], dtype=bool)

As a check we see that:

In[5]: np.flatnonzero(new_mask)
Out[5]: array([ 0,  2,  5,  7,  8, 10, 12, 15, 16, 18, 19], dtype=int64)

As expected, _5 == _2:

In[6]: np.all(_5 == _2)
Out[6]: True
like image 193
Michael Currie Avatar answered Nov 14 '22 23:11

Michael Currie


You could use np.bincount:

In [304]: mask = np.random.binomial(1, 0.5, size=10).astype(bool); mask
Out[304]: array([ True,  True, False,  True, False, False, False,  True, False,  True], dtype=bool)

In [305]: idx = np.flatnonzero(mask); idx
Out[305]: array([0, 1, 3, 7, 9])

In [306]: np.bincount(idx, minlength=len(mask)).astype(bool)
Out[306]: array([ True,  True, False,  True, False, False, False,  True, False,  True], dtype=bool)
like image 27
unutbu Avatar answered Nov 14 '22 22:11

unutbu