scipy 在Python中生成加权区间

q9rjltbz  于 2023-01-05  发布在  Python
关注(0)|答案(2)|浏览(135)

我知道如何用random.choice生成加权整数。
现在我有5000个从0到1000的整数,我想有75%落在0-500区间,20%落在501-750区间,还有5%落在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])
但是我只能得到随机排列的间隔。任何帮助都将不胜感激。

gmxoilav

gmxoilav1#

不如这样:

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

xxhby3vn2#

另一个版本是:

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)

与rocket解决方案的一些不同之处:

  • 更少/更小的临时变量和更多的矢量化机会
  • 允许概率取无理值
  • 运行时不依赖于生成的可能值的数量

相关问题