问题描述
我知道如何使用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)
火箭解决方案的一些区别:
- 更少/更小的临时变量和更多的矢量化机会
- 允许采用非理性值的可能性
- 运行时间不取决于生成的可能值的数量