【问题标题】:Drawing a random sample from a numpy array with index从具有索引的 numpy 数组中绘制随机样本
【发布时间】:2020-02-25 07:46:40
【问题描述】:

我有一个大小为 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)

问题在于速度,因为在整个模拟过程中我必须这样做数千次。 Snakeviz 强调这是一个需要改进的领域,因此,我想知道是否有人对如何提高速度有任何想法?

以上代码中使用的 Python 版本是 Python 3.8。

【问题讨论】:

  • 首先要做的是在循环外的变量中计算p=grid.ravel() / grid.ravel().sum(),至少在网格没有改变的情况下是这样。如果可能的话,随机选择也可以一次计算出一个完整的选择数组(有替换)。
  • 不幸的是,每个循环都需要计算网格,因为每次的概率都不一样。

标签: python python-3.x numpy


【解决方案1】:

以下似乎有点(我的笔记本电脑上的 x4)更快:

c = grid.ravel().cumsum()                                              
out = np.unravel_index(c.searchsorted(rng.uniform(0,c[-1])),grid.shape)

【讨论】:

    【解决方案2】:

    如果需要在 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)
    

    【讨论】:

      猜你喜欢
      • 2014-04-21
      • 2017-05-28
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2018-11-18
      相关资源
      最近更新 更多