Python 使用索引从numpy数组中绘制随机样本
我有一个12x12大小的numpy矩阵,包含概率。目的是使用这些概率获取随机样本,然后返回样本的索引 目前,我正在使用以下代码基于Python 使用索引从numpy数组中绘制随机样本,python,python-3.x,numpy,Python,Python 3.x,Numpy,我有一个12x12大小的numpy矩阵,包含概率。目的是使用这些概率获取随机样本,然后返回样本的索引 目前,我正在使用以下代码基于np.random.choice,其中grid=numpy矩阵执行此操作: rnd_choice = np.random.choice(grid.size, p=grid.ravel() / grid.ravel().sum()) sample_index = np.unravel_index(rnd_choice, grid.shape) 问题是速
np.random.choice
,其中grid=numpy矩阵执行此操作:
rnd_choice = np.random.choice(grid.size, p=grid.ravel() / grid.ravel().sum())
sample_index = np.unravel_index(rnd_choice, grid.shape)
问题是速度,因为在整个模拟过程中,我必须这样做几千次。Snakevis强调这是一个需要改进的领域,因此,我想知道是否有人对如何提高这一速度有任何想法
上面代码中使用的Python版本是Python 3.8。如果需要在for循环中计算grid.ravel,因为概率在for循环的每个周期中都会发生变化,您仍然可以通过每个周期只调用一次
.ravel()
来将计算负担降低两倍:
for cycle in loop:
# grid gets renewed here...
g_ravel = grid.ravel() # do the ravel() process only once
rnd_choice = np.random.choice(grid.size, p=g_ravel / g_ravel.sum())
sample_index = np.unravel_index(rnd_choice, grid.shape)
以下内容似乎快了一点(在我的笔记本电脑上是x4):
首先要做的是在循环外的变量中计算
p=grid.ravel()/grid.ravel().sum()
,至少在网格没有改变的情况下是这样。如果这是可能的,随机选择也可以一次计算一个完整的选择数组(替换)。不幸的是,网格需要在每个循环中计算,因为每次的概率都不同。
c = grid.ravel().cumsum()
out = np.unravel_index(c.searchsorted(rng.uniform(0,c[-1])),grid.shape)