【问题标题】:Pick random index in a 2D array which has a specific value using python使用python在具有特定值的二维数组中选择随机索引
【发布时间】:2022-01-18 19:54:59
【问题描述】:

所以说我有一个像这样的 numpy 数组:

[[2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 2 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 0 0 0 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 1 1 1 1 1 1 1 2 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 2 1 1 1 1 1 1 1 2 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 1 1 2 2 0 0 0 2 1 1 1 1 1 1 1 2 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 0 0 0 0 2 1 1 2 0 0 0 0 2 2 2 1 1 2 2 2 2 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 0 0 0 0 2 1 1 2 0 0 0 0 0 0 2 1 1 2 0 0 0 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 0 0 0 0 2 1 1 2 0 0 0 0 0 0 2 1 1 2 0 0 0 0]
 [2 2 2 2 2 1 1 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 2 1 1 2 0 0 0 0 0 0 2 1 1 2 0 0 0 0]
 [0 0 0 0 2 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 2 0 0 0 0 0 0 2 1 1 2 0 0 0 0]
 [0 0 0 0 2 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 2 0 0 2 2 2 2 2 1 1 2 2 0 0 0]
 [0 0 0 0 2 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 2 2 0 2 1 1 1 1 1 1 1 2 0 0 0]
 [2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 0 0 0 0 2 1 1 1 2 0 2 1 1 1 1 1 1 1 2 0 0 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 2 1 1 1 2 0 2 1 1 1 1 1 1 1 2 0 0 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 2 1 1 1 2 0 2 1 1 1 1 1 1 1 2 0 0 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 2 1 1 1 2 0 2 2 2 2 2 2 2 2 2 0 0 0]
 [2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]

我想在数组中随机选择一个位置为 1,我该怎么做?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    使用np.argwhererandom.choice

    import numpy as np
    import random
    
    a = np.random.choice([0, 1, 2], (20, 20))
    i = random.choice(np.argwhere(a == 1))
    

    【讨论】:

      【解决方案2】:

      您可以使用numpy.where 来识别值为 1 的单元格的坐标,然后从此输出中选择一个(或多个)随机索引:

      # test array
      a = np.random.randint(0, 3, size=(15, 10))
      
      # get coordinates where a == 1
      coords = np.c_[np.where(a==1)]
      
      # pick N random cells
      N = 1
      out = coords[np.random.choice(coords.shape[0], N, replace=False)]
      
      # check
      x,y = out[0]
      assert a[x,y] == 1
      

      示例:(5, 3)

      一个:

      array([[0, 1, 0, 1, 1, 2, 0, 2, 0, 0],
             [0, 2, 1, 2, 2, 0, 1, 1, 1, 1],
             [0, 1, 0, 0, 1, 2, 0, 2, 0, 1],
             [1, 2, 0, 1, 1, 1, 0, 2, 0, 2],
             [2, 0, 2, 0, 0, 0, 1, 1, 2, 0],
             [0, 1, 0, 1, 2, 2, 0, 1, 1, 1],
             [1, 2, 2, 2, 0, 2, 1, 0, 1, 2],
             [0, 0, 2, 0, 0, 0, 0, 0, 0, 2],
             [0, 2, 1, 1, 1, 0, 1, 1, 1, 0],
             [1, 2, 0, 1, 2, 0, 2, 0, 1, 2],
             [2, 1, 0, 1, 1, 0, 2, 2, 2, 2],
             [1, 2, 2, 2, 2, 2, 0, 1, 2, 2],
             [1, 2, 1, 0, 2, 2, 0, 2, 0, 0],
             [2, 0, 2, 2, 2, 0, 0, 0, 1, 2],
             [0, 1, 2, 2, 2, 1, 0, 0, 0, 0]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-06
        • 2014-04-28
        • 1970-01-01
        • 2018-11-11
        • 2017-05-28
        • 1970-01-01
        • 2018-01-08
        • 2018-11-18
        相关资源
        最近更新 更多