我想生成一个由两个元素序列组成的非均匀随机样本,由numpy.choice()
生成e.g。我有比例p = [0.1,0,0.3,0.6,0]的元素e = [0,1,2,3,4](这里的元素由指数标识) 我想要从这些比例中抽取两个元素的3个序列的样本: [03,23,32]
在这里,我们首先通过对元素索引零进行采样来绘制0,它代表总元素的10%,然后我们通过对索引3的元素进行抽样来绘制3,这代表60%的元素:这两个元素一起导致序列'03'
答案 0 :(得分:0)
如果你能找到一个整数N,对于x
中的每个元素p
,x*N
是一个整数,那么你可以:
p=[0.1, 0, 0.3, 0.6, 0]
N = 10
nums = []
for i, x in enumerate(p):
nums.extend([i] * int(x*N))
import random
random.choice(nums)
如果N非常大,那么你可以积累比例,并使用bisect
搜索0到1之间的随机数:
cp = []
s = 0
for x in p:
s += x
cp.append(s)
import bisect
[bisect.bisect_left(cp, random.random()) for i in range(10)]
如果你使用numpy:
import numpy as np
cp = np.cumsum(p)
np.searchsorted(cp, np.random.rand(10))
或:
np.random.choice(range(5), 10, p=p)