使用Numpy进行独特的随机数采样

tri*_*ook 5 python performance numpy

我需要创建一个10,000 x 50的数组,其中每行包含1到365之间的递增系列随机数,如下所示:

[[  4  11  14 ..., 355 360 364]
 [  2  13  15 ..., 356 361 361]
 [  4  12  18 ..., 356 361 365]
 ..., 
 [  6   9  17 ..., 356 362 364]
 [  1  10  19 ..., 352 357 360]
 [  1   9  17 ..., 356 358 364]]
Run Code Online (Sandbox Code Playgroud)

我想通过迭代器来解决这个问题的唯一方法:

sample_dates = np.array([np.sort(np.random.choice(365, 50, replace=False)) for _ in range(10000)])
Run Code Online (Sandbox Code Playgroud)

哪个有效,但速度相当慢(运行时间约为0.33秒),而且我将要这样做数千次).有没有更快的方法来实现这一目标?

编辑:据我所知,这个解决方案中最昂贵的部分是迭代和对np.random.choice的10k个别调用,而不是排序

Nil*_*ner 1

一种可能的优化是将sort其放在循环之外进行矢量化:

sample_dates = np.sort([np.random.choice(365, 50, replace=False) for _ in range(10000)], axis=1)
Run Code Online (Sandbox Code Playgroud)