在Python中生成加权间隔

问题描述

我知道如何使用random.choice生成加权整数。

现在我有5000个从0到1000的整数。我想说75%的用户在0-500的范围内,20%的501-750在751-1000的范围内。我尝试和失败的是

x = random.choice([np.arange(501),np.arange(501,751),np.arange(751,1001)],size=5000,p=[0.75,0.2,0.05])

但是我只能得到随机的间隔时间。任何帮助将不胜感激。

解决方法

这样的事情如何?

import numpy as np
x = np.random.choice(list(range(1001)),size=5000,p=
[.75/501]*501+[.2/250]*250+[.05/250]*250)
,

另一个版本是:

import numpy as np
from scipy import stats

N = 5000
probs = [0.75,0.2,0.05]
breaks = [0,501,751,1001]

# figure out how big each group should be
sizes = stats.multinomial.rvs(N,probs)

# get values for each group
x = np.concatenate([
  stats.randint.rvs(l,h,size=n)
  for n,l,h in zip(sizes,breaks,breaks[1:])])

# mix everything up
np.random.shuffle(x)

火箭解决方案的一些区别:

  • 更少/更小的临时变量和更多的矢量化机会
  • 允许采用非理性值的可能性
  • 运行时间不取决于生成的可能值的数量