2d numpy数组的加权随机抽样

时间:2017-08-24 13:17:37

标签: python arrays numpy random sampling

我有一个2d numpy数组Z,我想随机选择Z的索引,其中选择索引的机会与该索引处的Z值成比例。

现在,我正在做以下事情:

yar = list(np.ndenumerate(Z))
x,y = yar[np.random.choice(len(yar), p=Z.ravel()/Z.sum())][0]

这项工作起作用但感觉很可怕(而且非常慢)。还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

我们可以优化避免yar的创建。我们只需从np.random.choice获取等效的线性索引,将其转换为np.unravel_index的维度索引,即可为我们提供xy

因此,实施将是 -

linear_idx = np.random.choice(Z.size, p=Z.ravel()/float(Z.sum()))
x, y = np.unravel_index(linear_idx, Z.shape)

只是给出一些关于创建yar导致该设置瓶颈的数字的背景,这里是一个示例时间测试 -

In [402]: Z = np.random.randint(0,9,(300,400))

In [403]: yar = list(np.ndenumerate(Z))

In [404]: %timeit list(np.ndenumerate(Z))
10 loops, best of 3: 46.3 ms per loop

In [405]: %timeit yar[np.random.choice(len(yar), p=Z.ravel()/float(Z.sum()))][0]
1000 loops, best of 3: 1.34 ms per loop

In [406]: 46.3/(46.3+1.34)
Out[406]: 0.971872376154492

因此,创建yar 正在吃 97%运行时。