从numpy数组中进行概率选择

时间:2013-10-08 20:56:07

标签: python arrays numpy statistics distribution

Numpy是否有任何内置函数可以从1D numpy数组中随机选择值,并为数组末尾的值赋予更高的权重?有没有比定义偏斜分布和从中采样以获得数组索引更简单的方法呢?

1 个答案:

答案 0 :(得分:6)

您可以为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]