numpy中的非重复随机数

Aca*_*mia 56 random numbers numpy non-repetitive

我的问题是:如何在numpy中生成非重复的随机数?

list = np.random.random_integers(20,size=(10))
Run Code Online (Sandbox Code Playgroud)

小智 83

我认为numpy.random.sample现在不行.这是我的方式:

import numpy as np
np.random.choice(range(20), 10, replace=False)
Run Code Online (Sandbox Code Playgroud)

  • 而不是`range(n)`(或`arange(n)`)作为`choice`的第一个参数,它等同于传递`n`,例如`choice(20,10,replace = False)`. (23认同)
  • 为了避免非常大的“n”的时间和内存问题,请使用“numpy.random.Generator.choice”(从 numpy v1.17 开始) (3认同)
  • 请注意,对于大的“a”,“np.random.choice(a, size, Replace=False)”非常慢 - 在我的机器上,a=1M 大约需要 30 毫秒。 (2认同)

Sve*_*ach 72

如果您不坚持使用NumPy,您可以使用random.sample()标准库:

print random.sample(range(20), 10)
Run Code Online (Sandbox Code Playgroud)

使用NumPy,您将不得不使用numpy.random.shuffle()和切片:

a = numpy.arange(20)
numpy.random.shuffle(a)
print a[:10]
Run Code Online (Sandbox Code Playgroud)

  • @mrgloom在Python 3中,即使对于非常大的`n`,`random.sample(range(n),10))`也是有效的,因为`range`对象只是存储开始,结束和步长值的小包装,但不会创建整数的完整列表。在Python 2中,您可以将`range`替换为`xrange`,以获得类似的行为。 (2认同)

den*_*nis 8

几年后,有时需要从 10000^2\n 中选择 40000 个(Numpy 1.8.1,imac 2.7 GHz):

\n\n
import random\nimport numpy as np\n\nn = 10000\nk = 4\nnp.random.seed( 0 )\n\n%timeit np.random.choice( n**2, k * n, replace=True )  # 536 \xc2\xb5s \xc2\xb1 1.58 \xc2\xb5s\n%timeit np.random.choice( n**2, k * n, replace=False ) # 6.1 s \xc2\xb1 9.91 ms\n\n# https://docs.scipy.org/doc/numpy/reference/random/index.html\nrandomstate = np.random.default_rng( 0 )\n%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=False )  # 766 \xc2\xb5s \xc2\xb1 2.18 \xc2\xb5s\n%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=True )   # 1.05 ms \xc2\xb1 1.41 \xc2\xb5s\n\n%timeit random.sample( range( n**2 ), k * n )          # 47.3 ms \xc2\xb1 134 \xc2\xb5s\n
Run Code Online (Sandbox Code Playgroud)\n\n

(为什么要从 10000^2 中选择 40000 个?\n要生成大型\n scipy.sparse.random \n矩阵 - scipy 1.4.1 使用np.random.choice( replace=False ),slooooow。)

\n\n

向 numpy.random 的人们致敬。

\n