来自 2d numpy 数组的加权随机采样
Weighted Random Sampling from 2d numpy array
我有一个 2d numpy 数组 Z,我想随机选择 Z 的索引,其中选择索引的机会与该索引处的 Z 值成正比。
现在,我正在做以下事情:
yar = list(np.ndenumerate(Z))
x,y = yar[np.random.choice(len(yar), p=Z.ravel()/Z.sum())][0]
哪个工作可以但感觉很可怕(而且速度非常慢)。有没有更好的方法?
我们可以优化避免创建yar
。我们可以简单地从 np.random.choice
中获取等效的线性索引,将其转换为具有 np.unravel_index
的维度索引,从而得到 x
和 y
.
所以,实现将是 -
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 数组 Z,我想随机选择 Z 的索引,其中选择索引的机会与该索引处的 Z 值成正比。
现在,我正在做以下事情:
yar = list(np.ndenumerate(Z))
x,y = yar[np.random.choice(len(yar), p=Z.ravel()/Z.sum())][0]
哪个工作可以但感觉很可怕(而且速度非常慢)。有没有更好的方法?
我们可以优化避免创建yar
。我们可以简单地从 np.random.choice
中获取等效的线性索引,将其转换为具有 np.unravel_index
的维度索引,从而得到 x
和 y
.
所以,实现将是 -
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%
的运行时间。