为数组x中的每个元素选择n个项(从泊松分布中绘制)的快速方法

use*_*106 5 python arrays algorithm numpy

我在解决遇到的问题时遇到了一些麻烦.

我有一个价格阵列:

>>> x = np.random.randint(10, size=10)
array([6, 1, 7, 6, 9, 0, 8, 2, 1, 8])
Run Code Online (Sandbox Code Playgroud)

和(随机)生成的Poisson分布式到达阵列:

>>> arrivals = np.random.poisson(1, size=10)
array([4, 0, 1, 1, 3, 2, 1, 3, 2, 1])
Run Code Online (Sandbox Code Playgroud)

每个单一到达应与同一指数的价格相关联.所以在上面的例子中,第一个元素(x [0])应该选择4次(y [0]).第二个元素(x [1])应该被选择0次(y [1])...因此结果应该是:

array([6, 6, 6, 6, 7, 6, 9, 9, 9, 0, 0, 8, 2, 2, 2, 1, 1, 8])
Run Code Online (Sandbox Code Playgroud)

有没有(快速)方法来实现这一点,而不是迭代数组?任何帮助将不胜感激.

unu*_*tbu 6

你可以使用np.repeat:

In [43]: x = np.array([6, 1, 7, 6, 9, 0, 8, 2, 1, 8])

In [44]: arrivals = np.array([4, 0, 1, 1, 3, 2, 1, 3, 2, 1])

In [45]: np.repeat(x, arrivals)
Out[45]: array([6, 6, 6, 6, 7, 6, 9, 9, 9, 0, 0, 8, 2, 2, 2, 1, 1, 8])
Run Code Online (Sandbox Code Playgroud)

但请注意,对于某些计算,可能可以避免必须形成此中间数组.例如,请参阅scipy.stats.binned_statistic.