Search code examples
pythonarraysnumpywhere-clausemask

How can you turn an index array into a mask array in Numpy?


Is it possible to convert an array of indices to an array of ones and zeros, given the range? i.e. [2,3] -> [0, 0, 1, 1, 0], in range of 5

I'm trying to automate something like this:

>>> index_array = np.arange(200,300)
array([200, 201, ... , 299])

>>> mask_array = ???           # some function of index_array and 500
array([0, 0, 0, ..., 1, 1, 1, ... , 0, 0, 0])

>>> train(data[mask_array])    # trains with 200~299
>>> predict(data[~mask_array]) # predicts with 0~199, 300~499

Solution

  • Here's one way:

    In [1]: index_array = np.array([3, 4, 7, 9])
    
    In [2]: n = 15
    
    In [3]: mask_array = np.zeros(n, dtype=int)
    
    In [4]: mask_array[index_array] = 1
    
    In [5]: mask_array
    Out[5]: array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0])
    

    If the mask is always a range, you can eliminate index_array, and assign 1 to a slice:

    In [6]: mask_array = np.zeros(n, dtype=int)
    
    In [7]: mask_array[5:10] = 1
    
    In [8]: mask_array
    Out[8]: array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0])
    

    If you want an array of boolean values instead of integers, change the dtype of mask_array when it is created:

    In [11]: mask_array = np.zeros(n, dtype=bool)
    
    In [12]: mask_array
    Out[12]: 
    array([False, False, False, False, False, False, False, False, False,
           False, False, False, False, False, False], dtype=bool)
    
    In [13]: mask_array[5:10] = True
    
    In [14]: mask_array
    Out[14]: 
    array([False, False, False, False, False,  True,  True,  True,  True,
            True, False, False, False, False, False], dtype=bool)