How to randomly set elements in numpy array to 0

后端 未结 4 2201
我在风中等你
我在风中等你 2021-02-19 06:33

First I create my array

myarray = np.random.random_integers(0,10, size=20)

Then, I want to set 20% of the elements in the array to 0 (or some o

相关标签:
4条回答
  • 2021-02-19 06:53

    If you want the 20% to be random:

    random_list = []
    array_len = len(myarray)
    
    while len(random_list) < (array_len/5):
        random_int = math.randint(0,array_len)
        if random_int not in random_list:
            random_list.append(random_int)
    
    for position in random_list:
        myarray[position] = 0
    
    return myarray
    

    This would ensure you definitely get 20% of the values, and RNG rolling the same number many times would not result in less than 20% of the values being 0.

    0 讨论(0)
  • 2021-02-19 06:55

    You can calculate the indices with np.random.choice, limiting the number of chosen indices to the percentage:

    indices = np.random.choice(np.arange(myarray.size), replace=False,
                               size=int(myarray.size * 0.2))
    myarray[indices] = 0
    
    0 讨论(0)
  • 2021-02-19 06:55

    For others looking for the answer in case of nd-array, as proposed by user holi:

    my_array = np.random.rand(8, 50)
    indices = np.random.choice(my_array.shape[1]*my_array.shape[0], replace=False, size=int(my_array.shape[1]*my_array.shape[0]*0.2))
    

    We multiply the dimensions to get an array of length dim1*dim2, then we apply this indices to our array:

    my_array[np.unravel_index(indices, my_array.shape)] = 0 
    

    The array is now masked.

    0 讨论(0)
  • 2021-02-19 07:02

    Use np.random.permutation as random index generator, and take the first 20% of the index.

    myarray = np.random.random_integers(0,10, size=20)
    n = len(myarray)
    random_idx = np.random.permutation(n)
    
    frac = 20 # [%]
    zero_idx = random_idx[:round(n*frac/100)]
    myarray[zero_idx] = 0
    
    0 讨论(0)
提交回复
热议问题