从 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
的总体,并独立地从每个样本中获取样本,然后将它们合并)。
我想从列表中抽取项目样本,但我想设置包含每个项目的概率,不是要抽取的项目总数 (所以 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
的总体,并独立地从每个样本中获取样本,然后将它们合并)。