Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to randomly set elements in numpy array to 0

Tags:

python

numpy

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 other number). How should I do this? Apply a mask?

like image 477
Gen Tan Avatar asked Jan 31 '18 07:01

Gen Tan


4 Answers

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
like image 90
Mike Müller Avatar answered Oct 09 '22 22:10

Mike Müller


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.

like image 32
emil Avatar answered Oct 09 '22 21:10

emil


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
like image 2
dkato Avatar answered Oct 09 '22 22:10

dkato


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.

like image 1
Julian Chan Avatar answered Oct 09 '22 21:10

Julian Chan