具有非常规数组大小的 Numpy 随机选择
Numpy Random Choice with Non-regular Array Size
我正在制作一组来自负二项分布 (nbd) 的随机选择的总和,每个总和的长度都是非常规的。现在我按如下方式实现它:
import numpy
from numpy.random import default_rng
rng = default_rng()
nbd = rng.negative_binomial(1, 0.5, int(1e6))
gmc = [12, 35, 4, 67, 2]
n_pp = np.empty(len(gmc))
for i in range(len(gmc)):
n_pp[i] = np.sum(rng.choice(nbd, gmc[i]))
这行得通,但是当我对我的实际数据执行它时它非常慢(gmc 的维度为 1e6),我想在 nbd 中针对 n 和 p 的多个值改变它(在这个例子中他们分别设置为 1 和 0.5)。
我想找出一种 pythonic 方法来消除循环,但我不确定是否可行。如果可能的话,我想保留 default_rng 以获得比旧方法 (np.random.choice) 更好的随机生成。
参数(n, p)
的负二项分布m
个样本之和的分布是参数(m*n, p)
的负二项分布。因此,您可以直接使用 negative_binomial(gmc, 0.5)
:
生成结果,而不是从大量预先计算的 negative_binomial(1, 0.5)
样本中随机选择求和
In [68]: gmc = [12, 35, 4, 67, 2]
In [69]: npp = rng.negative_binomial(gmc, 0.5)
In [70]: npp
Out[70]: array([ 9, 34, 1, 72, 7])
(negative_binomial
方法将广播其输入,因此我们可以将 gmc
作为参数传递一次调用生成所有样本。)
更一般地说,如果您想改变用于生成 nbd
的 n
,您可以将 n
乘以 gmc
中的相应元素,然后将产品传递给 rng.negative_binomial
.
我正在制作一组来自负二项分布 (nbd) 的随机选择的总和,每个总和的长度都是非常规的。现在我按如下方式实现它:
import numpy
from numpy.random import default_rng
rng = default_rng()
nbd = rng.negative_binomial(1, 0.5, int(1e6))
gmc = [12, 35, 4, 67, 2]
n_pp = np.empty(len(gmc))
for i in range(len(gmc)):
n_pp[i] = np.sum(rng.choice(nbd, gmc[i]))
这行得通,但是当我对我的实际数据执行它时它非常慢(gmc 的维度为 1e6),我想在 nbd 中针对 n 和 p 的多个值改变它(在这个例子中他们分别设置为 1 和 0.5)。
我想找出一种 pythonic 方法来消除循环,但我不确定是否可行。如果可能的话,我想保留 default_rng 以获得比旧方法 (np.random.choice) 更好的随机生成。
参数(n, p)
的负二项分布m
个样本之和的分布是参数(m*n, p)
的负二项分布。因此,您可以直接使用 negative_binomial(gmc, 0.5)
:
negative_binomial(1, 0.5)
样本中随机选择求和
In [68]: gmc = [12, 35, 4, 67, 2]
In [69]: npp = rng.negative_binomial(gmc, 0.5)
In [70]: npp
Out[70]: array([ 9, 34, 1, 72, 7])
(negative_binomial
方法将广播其输入,因此我们可以将 gmc
作为参数传递一次调用生成所有样本。)
更一般地说,如果您想改变用于生成 nbd
的 n
,您可以将 n
乘以 gmc
中的相应元素,然后将产品传递给 rng.negative_binomial
.