Python 如何将numpy数组中的元素随机设置为0

Python 如何将numpy数组中的元素随机设置为0,python,numpy,Python,Numpy,首先,我创建我的数组 myarray = np.random.random_integers(0,10, size=20) 然后,我想将数组中20%的元素设置为0(或其他数字)。我该怎么做?应用遮罩?如果希望20%是随机的: random_list = [] array_len = len(myarray) while len(random_list) < (array_len/5): random_int = math.randint(0,array_len) if

首先,我创建我的数组

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

然后,我想将数组中20%的元素设置为0(或其他数字)。我该怎么做?应用遮罩?

如果希望20%是随机的:

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
random_list=[]
数组_len=len(myarray)
而len(随机列表)<(数组len/5):
random\u int=math.randint(0,数组长度)
如果random_int不在random_列表中:
随机列表。追加(随机整数)
对于随机列表中的位置:
myarray[位置]=0
返回myarray

这将确保您肯定获得20%的值,并且RNG多次滚动相同的数字不会导致小于20%的值为0。

您可以使用
np.random.choice
计算索引,将所选索引的数量限制为百分比:

indices = np.random.choice(np.arange(myarray.size), replace=False,
                           size=int(myarray.size * 0.2))
myarray[indices] = 0

使用
np.random.permutation
作为随机索引生成器,并获取索引的前20%

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

对于用户holi建议的在nd阵列情况下寻找答案的其他人:

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))
我们乘以维数得到长度为dim1*dim2的数组,然后将此索引应用于数组:

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

阵列现在被屏蔽。

酷。我还应该为np.random.choice设置
replace=False
,对吗?如果我没有,生成的一些索引将被重复是。更新了我的答案。对于任意形状的数组,我们可以使用unravel_index:myarray[np.unravel_index(index,myarray.shape)]=0@Holi的注释是一个非常有用的补充,它应该被合并到这个答案中,或者作为它自己的单独答案,IMODeprecationWarning:这个函数已被弃用。请致电randint(0,10+1)。现在是:myarray=np.random.randint(0,10,size=20)