【问题标题】:Numpy random array from 0 to 99, including both从 0 到 99 的 Numpy 随机数组,包括两者
【发布时间】:2021-04-04 23:31:32
【问题描述】:

我正在尝试创建一个大小为 (80,10) 的 np 数组,因此每一行都有范围为 0 到 99 的随机值。

我已经做到了

np.random.randint(99, size=(80, 10))

但我希望始终在每行中同时包含 0 和 99 作为值。

所以每行中的两个值已经定义,另外 8 个是随机的。

我将如何做到这一点?有没有办法生成一个数组大小 (80,8) 并将 [0,99] 连接到每一行以使其最后成为 (80,10)?

【问题讨论】:

  • 您是否要求 0 和 99 对于每一行都是唯一的,或者是否允许与其他 8 个值重复?
  • 更容易随机创建所有条目然后替换它们:arx[:,8] = 0arx[:,9] = 99
  • @Reti43 对,我希望在其他 8 个中没有任何重复项
  • @TimRoberts 我猜仍然生成长度为 10 并替换最后两个值?
  • 您可以生成一个随机值的矩阵,包括 0 和 99。然后按照上面的建议将随机索引替换为 0 和 99。

标签: python numpy random


【解决方案1】:

正如 Tim 在 cmets 中所建议的,您可以生成一个随机值不包括 099 的矩阵。然后将沿第二个轴的两个随机索引替换为值099

rand_arr = np.random.randint(low=1, high=98, size=(80, 10))
rand_indices = np.random.rand(80,10).argsort(axis=1)[:,:2]
np.put_along_axis(rand_arr, rand_indices, [0,99], axis=1)

使用argsort 的动机是我们想要沿第二个轴的随机索引而不需要替换。仅使用 size=(80,2) 为值 0-10 生成一个随机整数矩阵并不能保证这一点。

在您的场景中,您可以使用kth=2 而不是np.argsort 来执行np.argpartion。这应该更有效。

【讨论】:

  • 这是迄今为止提供的最佳答案。 argsort 和 put_along_axis 的组合是我没有想到的。不幸的是,OP 继续接受了一个明确不考虑重复的答案,即使他说他宁愿不这样做。
【解决方案2】:

我已经尝试了一些东西,这就是我想出的

def generate_matrix(low, high, shape):
    x, y = shape
    values = np.random.randint(low+1, high-1, size=(x, y-2))
    predefined = np.tile([low, high], (x, 1))
    values = np.hstack([values, predefined])
    for row in values:
        np.random.shuffle(row)
    return values

示例用法

>>> generate_matrix(0, 99, (5, 10))
array([[94,  0, 45, 99, 18, 31, 78, 80, 32, 17],
       [28, 99, 72,  3,  0, 14, 26, 37, 41, 80],
       [18, 78, 71, 40, 99,  0, 85, 91,  8, 59],
       [65, 99,  0, 45, 93, 94, 16, 33, 52, 53],
       [22, 76, 99, 15, 27, 64, 91, 32,  0, 82]])

我接近它的方式:

在 [1, 98] 范围内生成一个大小为 (80, 8) 的数组,然后将每行的 0 和 99 连接起来。但是您可能需要 0/99 出现在每行的不同索引处,因此您必须对它们进行洗牌。不幸的是,np.random.shuffle() 只会在它们之间打乱行。如果你使用np.random.shuffle(arr.T).Trandom.Generator.permutation,你就不会独立地洗牌。除了使用 Python 循环之外,我还没有找到一种矢量化的方式来独立地打乱行。

另一种方式:

您可以在 [1, 98] 范围内生成一个大小为 (80, 10) 的数组,然后在随机索引中替换每行的值 0 和 99。同样,如果没有 Python 循环,我无法找到一种方法来为每行生成唯一索引(例如,0 不会覆盖 99)。由于找不到避免 Python 循环的方法,我选择了第一种方法,这种方法看起来更简单。

【讨论】:

    【解决方案3】:

    如果您不关心重复项,请创建一个零数组,将第 1-9 列替换为随机数,并将第 10 列设置为 99。

    final = np.zeros(shape=(80, 10))
    final[:,1:9] = np.random.randint(97, size=(80, 8))+1
    final[:,9] = 99
    

    【讨论】:

      【解决方案4】:

      创建一个 80x10 的矩阵,其随机值从 0 到 99,在同一行中没有重复,每行都包含 0 和 99

      import random
      row99=[ n for n in range(1,99) ]
      perm = [n for n in range(0,10) ]
      m = []
      for i in range(80):
          random.shuffle(row99)      
          random.shuffle(perm)
          
          r = row99[:10]
          r[perm[0]] = 0
          r[perm[1]] = 99
      
          m.append(r)
          
      print(m)
      
      

      部分输出:

      [
         ... other elements here ...
      [70, 58, 0, 25, 41, 10, 90, 5, 42, 18], 
      [0, 57, 90, 71, 39, 65, 52, 24, 28, 77], 
      [55, 42, 7, 9, 32, 69, 90, 0, 64, 2], 
      [0, 59, 17, 35, 56, 34, 33, 37, 90, 71]]
      

      【讨论】:

      • 没有理由在 numpy 解决方案中使用循环,但这是正确的想法
      • 我同意,但是,np.random.randint(0,10, size=(10,10)) 给我们在同一行重复。所以目前我没有看到任何没有重复的解决方案,除了我的。
      • @Reti43 现在 0 和 99 都存在
      猜你喜欢
      • 2019-05-02
      • 2022-11-13
      • 2014-11-04
      • 1970-01-01
      • 2014-05-15
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多