【问题标题】:how to shuffle a binary array a specific amount如何将二进制数组洗牌特定数量
【发布时间】:2019-12-29 02:47:29
【问题描述】:

我有一个二进制数组。我想对其进行洗牌,以使 n 百分比的随机元素保持在同一位置,而其余的则被洗牌。另一种说法是,我有一个二进制数组,我想创建第二个数组,与第一个使用 difflib

我正在使用 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)

【问题讨论】:

    标签: python arrays random shuffle


    【解决方案1】:

    如果您愿意使用 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])
    

    【讨论】:

    • 我在测试此代码时收到错误AttributeError: module 'numpy' has no attribute 'shuffle'np.random.shuffle 似乎可以工作
    • 哎呀。它应该是np.random.shuffle。现已修复
    • 这可能是一个单独的问题,但如果我想使用此代码返回几个混洗数组(所有不同,但基于相同的初始数组)我该怎么做?使用 for 循环时,我多次得到相同的洗牌数组for i in range(10): print(arr)
    • 将代码包装成一个以数组为输入的函数。第一行函数是使用arr.copy()创建数组的副本,然后对副本执行操作以免更改原始数组
    【解决方案2】:

    我认为您不会为此找到标准功能。 您可以将 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)
    

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

    【讨论】:

      猜你喜欢
      • 2019-08-18
      • 2019-02-07
      • 2013-08-30
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 2021-12-17
      相关资源
      最近更新 更多