来自 2d numpy 数组的加权随机采样

Posted

技术标签:

【中文标题】来自 2d numpy 数组的加权随机采样【英文标题】:Weighted Random Sampling from 2d numpy array 【发布时间】:2018-02-02 09:37:09 【问题描述】:

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

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

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

它可以完成这项工作,但感觉很糟糕(而且速度极慢)。有没有更好的办法?

【问题讨论】:

查看Raymond Hettinger tweet关于 wighted random 的信息,可能会有所帮助 【参考方案1】:

我们可以优化避免创建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% 那里的运行时。

【讨论】:

以上是关于来自 2d numpy 数组的加权随机采样的主要内容,如果未能解决你的问题,请参考以下文章

Numpy实现UpSampling2D(上采样)

重新采样一个 numpy 数组

对一维 numpy 数组进行下采样

重新采样表示图像的 numpy 数组

对 numpy 数组进行二次采样/平均

对numpy数组中的每个第n个条目进行二次采样