【问题标题】:Efficient Way to create a 2d array of random shuffling of a range of numbers [duplicate]创建一系列数字随机改组的二维数组的有效方法[重复]
【发布时间】:2018-05-07 15:36:25
【问题描述】:

我需要创建一个由 0 到 N 随机打乱的数字组成的 N x M numpy 数组。也就是说,矩阵的每一行都具有随机顺序中的每个数字 0 到 N 中的一个,没有重复元素,并且每个表示数字。

到目前为止我能想到的最好的是(对于 N = 10 和 M = 5)

import random
import numpy as np

a = np.array([random.sample(range(10), 10) for x in range(5)])

这给了我

[[5 9 1 3 8 2 6 4 0 7]
 [4 8 5 2 9 3 7 6 0 1]
 [8 4 6 7 9 2 0 5 1 3]
 [3 5 4 9 2 0 6 7 1 8]
 [6 0 4 7 3 2 1 8 5 9]]

我当前的解决方案确实有效,但如果可能的话,我只想拥有一个随机库(我在其他地方使用 numpy,因此只有 numpy 的解决方案是理想的)。我假设 numpy 有一个更简单的方法来做到这一点,但我目前正在想念它。

【问题讨论】:

  • import numpy as np, 当然.... 然后... np.random.randint(0, 10, size=(5, 10))
  • @JohnColeman 这是我最初的想法,但我不确定如何创建数组以使其具有相同的随机 0->N 但顺序不同
  • 编辑您的问题以反映这一点
  • 它不会减少您需要进行的库调用次数,但a = np.array([np.random.permutation(10) for _ in range(5)]) 可能会更干净。
  • 感谢@Divakar,这是一个完美的答案。我猜我在挖掘时没有找到正确的搜索词

标签: python python-3.x numpy random


【解决方案1】:

如果问题只是只使用一个随机库(正如您在 cmets 中所说),您可以使用 numpy.random.choice 和参数 replace=False,这样可以确保每个元素不重复:

import numpy as np

a = np.stack([np.random.choice(range(10), 10, replace=False) for _ in range(5)])

>>> a
array([[0, 9, 3, 5, 8, 7, 1, 4, 6, 2],
       [5, 6, 8, 3, 0, 4, 7, 9, 2, 1],
       [7, 4, 9, 5, 0, 1, 6, 8, 3, 2],
       [9, 0, 3, 8, 5, 7, 6, 1, 4, 2],
       [5, 6, 0, 1, 3, 4, 9, 8, 7, 2]])

【讨论】:

    猜你喜欢
    • 2018-08-22
    • 2014-07-29
    • 1970-01-01
    • 2014-08-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    相关资源
    最近更新 更多