如何将二进制数组打乱特定数量

how to shuffle a binary array a specific amount

我有一个二进制数组。我想打乱它,使 n% 的随机元素留在同一个地方,其余的被打乱。另一种说法是,我有一个二进制数组,我想创建第二个长度相同的数组,并且与使用 difflib[=12= 的第一个数组相比,n% 相似]

我正在使用 random.shuffle 打乱数组,但找不到有关我问题的百分比部分的信息。

import random

array = [1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0]
random.shuffle(array)
print(array)

如果您愿意使用 numpy,您可以创建一个布尔掩码来提取 arr 的大约 n 部分,打乱抽取的样本,然后将打乱的结果放回掩码位置。

import numpy as np

n = 0.2
arr = np.array([1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0])

# create boolean mask of about fraction n
ix = np.random.choice([True, False], size=arr.size, replace=True, p=[n, 1-n])

# pull the masked portion and shuffle
arr_shuff = arr[ix]
np.random.shuffle(arr_shuff)

# reinsert
arr[ix] = arr_shuff

arr
# returns:
array([1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0])

我认为您不会为此找到标准函数。 您可以将 n * len(array) 与数组中的其他项交换:

import random

array = [1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0]
n = 0.2

for i in range(int(n*len(array))):
    ri = random.randrange(len(array))
    array[i], array[ri] = array[ri], array[i]

print(array)

但是,如果数组只填充了零或一个,你将不会得到差异。