如何在保持d分布的同时从python中的列表中随机抽样

2024-05-17 01:12:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

a = 17%
b = 12%
c = 4%
etc.

“a”列表中有1700项。 “b”列表中有1200项。 “c”在列表中有400项。在

我需要一个模拟a、b、c等分布的示例,而不是使用所有信息

所以最终的目标是

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

我知道如何从列表中随机选择信息,但我还没能想出如何在强制结果具有相同分布的情况下随机选择。在


Tags: 项目信息示例目标列表etc情况
3条回答

在您的选择中“模拟”这种分布的一种方法是简单地将列表组合成一个,然后从该列表中选择所需的项目总数。如果需要选择的项目总数很大,那么这个近似值就可以了。在

请注意,它并不保证将从每个列表中选择这些数量。但是,如果列表很大,并且这个例程有很多次运行,那么平均值应该是好的。在

import random
 total = a + b + c + ...
 samples = []
 number = len(total) / 10
 for i in range(number):
     samples.append(total[random.rand(0, len(total) - 1])

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

要从ab和{}中获取{}元素,可以将这三个列表连接在一起,并从结果列表中使用^{}随机选取元素:

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']

对于每个元素,您将得到一个len(a) / len(a + b + c)概率,从a获得一个元素。在

但是,同一个元素可能会多次出现。如果不希望发生这种情况,可以使用^{}。在

根据我的理解,你有三个不同的群体,你想从这些群体中随机抽样,但是选择某些群体的概率有偏差。在这种情况下,首先随机生成与每个总体相对应的索引列表(因为我将它们组合成一个称为combined)的2D数组。在

然后,您可以遍历随机生成的索引列表,该列表提供了要从中选择的总体,然后使用^{}从该数据中随机选取。在

import numpy as np

sample_a = np.arange(1, 1000)
sample_b = np.arange(1001, 2000)
sample_c = np.arange(2001, 3000)

combined = np.vstack((sample_a, sample_b, sample_c))

distributions = [0.7, 0.2, 0.1] # The skewed probability distribution for sampling

sample = np.random.choice([0, 1, 2], size=10, p=distributions) # Choose indices with skewed probability

combined_pool = []

for arr in sample:
    combined_pool.append(np.random.choice(combined[arr]))

相关问题 更多 >