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

前端 未结 4 1068
孤街浪徒
孤街浪徒 2020-12-14 17:04

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 so

相关标签:
4条回答
  • 2020-12-14 17:16

    There's a nice trick to do this as a one-liner, too - use the numpy.in1d and numpy.arange functions like this (the final line is the key part):

    >>> x = np.linspace(-2, 2, 10)
    >>> y = x**2 - 1
    >>> idxs = np.where(y<0)
    
    >>> np.in1d(np.arange(len(x)), idxs)
    array([False, False, False,  True,  True,  True,  True, False, False, False], dtype=bool)
    

    The downside of this approach is that it's ~10-100x slower than the appropch Warren Weckesser gave... but it's a one-liner, which may or may not be what you're looking for.

    0 讨论(0)
  • 2020-12-14 17:29

    For a single dimension, try:

    n = (15,)
    index_array = [2, 5, 7]
    mask_array = numpy.zeros(n)
    mask_array[index_array] = 1
    

    For more than one dimension, convert your n-dimensional indices into one-dimensional ones, then use ravel:

    n = (15, 15)
    index_array = [[1, 4, 6], [10, 11, 2]] # you may need to transpose your indices!
    mask_array = numpy.zeros(n)
    flat_index_array = np.ravel_multi_index(
        index_array,
        mask_array.shape)
    numpy.ravel(mask_array)[flat_index_array] = 1
    
    0 讨论(0)
  • 2020-12-14 17:36

    As requested, here it is in an answer. The code:

    [x in index_array for x in range(500)]
    

    will give you a mask like you asked for, but it will use Bools instead of 0's and 1's.

    0 讨论(0)
  • 2020-12-14 17:37

    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)
    
    0 讨论(0)
提交回复
热议问题