Python 从numpy数组中进行概率选择

Python 从numpy数组中进行概率选择,python,arrays,numpy,statistics,distribution,Python,Arrays,Numpy,Statistics,Distribution,Numpy是否有任何内置函数可以从一维Numpy数组中随机选择值,数组末尾的值具有更高的权重?有没有比定义倾斜分布并从中采样以获得数组索引更简单的方法呢?您可以为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

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

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

对于
np.exp(i)

如果您只想获得每个值一次,请确保设置
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]

我有点困惑。如果这是您的目标,那么选择实际上不是随机的。此外,如果在最后给物品更多的重量,那么最后一件物品不总是会被挑选,因为它的重量最大吗?
idx = np.random.poisson(size=10)
a[-idx-1]