高效创建一系列数字随机改组的二维数组

时间:2018-05-07 15:36:26

标签: python python-3.x numpy random

我需要创建一个N x M numpy数组,随机抽取数字0到N.也就是说矩阵的每一行都有一个随机顺序中每个数字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有一个更简单的方法来做到这一点,但我现在错过了它。

1 个答案:

答案 0 :(得分:3)

如果问题仅仅是使用一个随机库(正如您在评论中所述),您可以使用numpy.random.choice和参数replace=False,这可以确保每个元素不会重复:< / p>

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]])