如何在保持数据分布的同时从Python列表中随机采样

Sta*_*kid 3 python random distribution frequency-distribution

本质上,我想做的是从列表中随机选择项目,同时保持内部分布。请参阅以下示例。

a = 17%
b = 12%
c = 4%
etc.
Run Code Online (Sandbox Code Playgroud)

“a”列表中有 1700 个项目。“b”的列表中有 1200 个项目。“c”列表中有 400 个项目。

我不想使用所有信息,而是想要一个模仿 a、b、c 等分布的样本。

所以我们的目标是最终,

从“a”中随机选择 170 个项目 从“b”中随机选择 120 个项目 从“c”中随机选择 40 个项目

我知道如何从列表中随机选择信息,但我无法弄清楚如何随机选择同时强制结果具有相同的分布。

Eri*_*nil 5

如果您的列表不是很大并且内存不是问题,您可以使用这个简单的方法。

要从、和获取n元素,您可以将三个列表连接在一起,并使用以下命令从结果列表中选择随机元素:abcrandom.choice

import random

n = 50
a = ['a'] * 170
b = ['b'] * 120
c = ['c'] * 40
big_list = a + b + c
random_elements = [random.choice(big_list) for i in range(n)]
# ['a', 'c', 'a', 'a', 'a', 'b', 'a', 'c', 'b', 'a', 'c', 'a',
# 'a', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 'a', 'a', 'c', 'a',
# 'c', 'a', 'b', 'a', 'a', 'c', 'a', 'b', 'a', 'c', 'b', 'a',
# 'a', 'b', 'a', 'b', 'a', 'a', 'c', 'a', 'c', 'a', 'b', 'c',
# 'b', 'b']
Run Code Online (Sandbox Code Playgroud)

对于每个元素,您将获得len(a) / len(a + b + c)从 中获取元素的概率a

不过,您可能会多次获得相同的元素。如果您不希望这种情况发生,您可以使用random.shuffle.