4

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

4

1 回答 1

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]
于 2013-10-08T21:06:26.503 回答