你可以给np.choice一个权重,如图:
a = np.random.random(100) # an array to draw from
n = 10 # number of values to draw
i = np.arange(a.size) # an array of the index value for weighting
w = np.exp(i/10.) # higher weights for larger index values
w /= w.sum() # weight must be normalized
现在,通过以下方式访问您的价值观:
np.random.choice(a, size=n, p=w)
显然,您可以根据需要更改权重数组,我从末尾进行了指数衰减,衰减长度为10;增加衰减长度以获得更广泛的选择:
对于np.exp(i/50.):
In [38]: np.random.choice(a, size=n, p=w)
Out[38]: array([37, 53, 45, 22, 88, 69, 56, 86, 96, 24])
对于np.exp(i):
In [41]: np.random.choice(a, size=n, p=w)
Out[41]: array([99, 99, 98, 99, 99, 99, 99, 97, 99, 98])
如果您只想获取每个值一次,请务必设置replace=False,否则您可以多次获取相同的值(尤其是在高度加权的情况下,如上面的第二个示例)。看这个例子:
In [33]: np.random.choice(a, size=n, replace=False, p=w)
Out[33]: array([99, 84, 86, 91, 87, 81, 96, 89, 97, 95])
In [34]: np.random.choice(a, size=n, replace=True, p=w)
Out[34]: array([94, 98, 99, 98, 97, 99, 91, 96, 97, 93])
我原来的答案是:
如果分布的形式并不重要,您可以执行指数泊松分布之类的操作:
idx = np.random.poisson(size=10)
您的样本:
a[-idx-1]