如何在数组/列表中进行随机抽样(替换),而不是使用python对列表中的各个元素进行采样

时间:2018-09-27 12:15:29

标签: python arrays

如下面的python代码所示,我能够将列表从列表中拆分成块数组:

def split_list(the_list, chunk_size):
    result_list = []
    while the_list:

result_list.append(the_list[:chunk_size])
            the_list = the_list[chunk_size:]

    return result_list

a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print split_list(a_list, 3)

产生以下大块数组结果:

# [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

我还知道通过numpy.random.choice(甚至替换)进行随机采样,如下所示:

import numpy as np
a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
np.random.choice(a_list, size=20, 
replace=True)

产生以下结果:

#array([ 6,  9,  4,  9,  1,  1,  6, 10,  8,  5, 10,  6,  2,  6,  7,  1,  3,
    2,  7,  6])

我想要的 我想对数组中的块进行采样(每个块的元素保持原样)并进行替换。

我期待获得一个将产生如下内容的代码:

# [[7, 8, 9], [1, 2, 3], [4, 5, 6], [7, 8, 9], [10], [1, 2, 3], [1, 2, 3], [10], [1, 2, 3], [7, 8, 9], [1, 2, 3], [1, 2, 3], [10], [4, 5, 6], [4, 5, 6], [10], [10], [7, 8, 9],, [1, 2, 3], [7, 8, 9]]

我自己挑选了上面的块样本,我需要帮助来获取有效的python代码来为我完成此操作。

1 个答案:

答案 0 :(得分:1)

您可以确定列表中不同块的数量(示例中为4),然后随机选择所需索引的索引(示例中为0到3)。

因此,您可以这样做:

import math
import random

def random_chunk(lst, chunk_size):
    nb_chunks = int(math.ceil(len(lst)/chunk_size))
    choice = random.randrange(nb_chunks) # 0 <= choice < nb_chunks
    return lst[choice*chunk_size:(choice+1)*chunk_size]

a_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
out = [random_chunk(a_list, chunk_size=3) for _ in range(20)]

print(out)

# [[10], [7, 8, 9], [4, 5, 6], [4, 5, 6], [1, 2, 3], [7, 8, 9], [7, 8, 9], [4, 5, 6],
#  [10], [7, 8, 9], [10], [10], [10], [7, 8, 9], [10], [10], [10], [4, 5, 6], [4, 5, 6], [10]]