从numpy阵列中进行概率选择

2024-05-15 19:22:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 方法函数numpy定义数组内置权重末尾
1条回答
网友
1楼 · 发布于 2024-05-15 19:22:35

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

现在,通过以下方式访问您的值:

^{pr2}$

很明显,你可以随意改变你的权重数组,我用衰变长度从末尾开始做了一个指数衰减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]

相关问题 更多 >