Python 如何将二进制数组洗牌指定数量

Python 如何将二进制数组洗牌指定数量,python,arrays,random,shuffle,Python,Arrays,Random,Shuffle,我有一个二进制数组。我想洗牌,这样n%的随机元素留在同一个地方,其余的被洗牌。另一种说法是,我有一个二进制数组,我想创建第二个数组,与使用difflib的第一个数组相比,该数组的长度相同,并且有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)

我有一个二进制数组。我想洗牌,这样n%的随机元素留在同一个地方,其余的被洗牌。另一种说法是,我有一个二进制数组,我想创建第二个数组,与使用difflib的第一个数组相比,该数组的长度相同,并且有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,您可以创建一个布尔掩码,以提取大约n部分的arr,对提取的样本进行洗牌,然后将洗牌结果放回掩码位置

将numpy导入为np
n=0.2
arr=np.数组([1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0])
#创建分数n左右的布尔掩码
ix=np.random.choice([True,False],size=arr.size,replace=True,p=[n,1-n])
#拉动蒙面部分并洗牌
arr_shuff=arr[ix]
np.random.shuffle(arr_shuff)
#重新插入
arr[ix]=arr_shuff
啊
#返回:
数组([1,1,1,1,1,1,1,0,1,1,0,1,0,0,0,0,0,0])

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

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)

但是,如果数组中只填充了0或1,则不会得到任何差异。

我得到错误
AttributeError:module'numpy'在测试此代码时没有属性“shuffle”
,但是
np.random.shuffle
似乎很有效。它应该是
np.random.shuffle
。现在修复了这可能是一个单独的问题,但是如果我想使用这段代码返回几个无序数组(所有数组都不同,但基于相同的初始数组),我该如何做呢?当使用for循环时,我在范围(10):print(arr)中多次获得相同的洗牌数组。函数的第一行是使用
arr.copy()
创建数组的副本,然后对副本执行操作,以避免更改原始数组