【问题标题】:Probabilistic selection from a numpy array从 numpy 数组中进行概率选择
【发布时间】:2013-10-15 23:56:16
【问题描述】:

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

【问题讨论】:

  • 我有点困惑。如果这是您的目标,那么选择实际上并不是随机的。此外,如果最后的物品重量更大,那么由于重量最大,最后一个物品不会总是被挑选出来吗?

标签: python arrays numpy statistics distribution


【解决方案1】:

你可以给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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2023-04-03
    • 2018-08-22
    • 1970-01-01
    • 2022-01-08
    • 2017-11-23
    相关资源
    最近更新 更多