从 python 中的列表中快速、独立地随机抽取/抽样 - 固定概率,而不是总数

Fast, independent random draws / sample from a list in python - fixed probability, not total number

我想从列表中抽取项目样本,但我想设置包含每个项目的概率,不是要抽取的项目总数 (所以 random.sample() 不起作用)。我用下面的代码得到了我想要的效果(其中 p 是包含的概率,items 是事物的列表):

[item for item in items if random.random() < p]

但是速度很慢。有什么加快速度的建议吗?

该列表最多有 1000 万个项目,并且是单一类型的(所有整数),所以也许有一个 numpy / pandas 解决方案?

谢谢!

尼克

结果样本中的项目数量(n 以概率 p 独立尝试)具有二项分布,因此可以快速随机生成,例如 numpy

sample_size = numpy.random.binomial(len(population). p)

现在,the_sample = random.sample(population, sample_size) 完全可以满足您的需求——相当于以相同的概率 p.

随机、独立地挑选总体中的每个项目

这是基于你的示例代码,你说它太慢但也说它在其他方面没问题——即,人口中的每个项目都相同 p。如果每个项目都有一个完全不同的p,这是行不通的(如果p有几个不同的值,它可以通过分层抽样来工作——将人口分成统一的,每个子-单个值 p 的总体,并独立地从每个样本中获取样本,然后将它们合并)。