¿Cómo puedo generar números aleatorios no repetitivos en numpy?
list = np.random.random_integers(20,size=(10))
¿Cómo puedo generar números aleatorios no repetitivos en numpy?
list = np.random.random_integers(20,size=(10))
Respuestas:
numpy.random.Generator.choice
ofrece un replace
argumento para muestrear sin reemplazo:
from numpy.random import default_rng
rng = default_rng()
numbers = rng.choice(20, size=10, replace=False)
Si está en un NumPy anterior a 1.17, sin la Generator
API, puede usar random.sample()
desde la biblioteca estándar:
print(random.sample(range(20), 10))
También puede usar numpy.random.shuffle()
y cortar, pero esto será menos eficiente:
a = numpy.arange(20)
numpy.random.shuffle(a)
print a[:10]
También hay un replace
argumento en la numpy.random.choice
función heredada , pero este argumento se implementó de manera ineficiente y luego se dejó ineficaz debido a las garantías de estabilidad del flujo de números aleatorios, por lo que no se recomienda su uso. (Básicamente hace la cosa de mezclar y cortar internamente).
import random
?
random.sample(range(n), 10))
será eficiente incluso para muy grandes n
, ya que un range
objeto es solo un contenedor pequeño que almacena valores de inicio, parada y paso, pero no crea la lista completa de enteros. En Python 2, puede reemplazar range
con xrange
para obtener un comportamiento similar.
Creo numpy.random.sample
que no funciona bien ahora. Esta es mi manera:
import numpy as np
np.random.choice(range(20), 10, replace=False)
range(n)
(o arange(n)
) como primer argumento de choice
, es equivalente a pasar n
, por ejemplo choice(20, 10, replace=False)
.
np.random.choice(a, size, replace=False)
es muy lento para grandes a
: en mi máquina, alrededor de 30 ms para a = 1M.
n
uso muy extenso numpy.random.Generator.choice
(comenzando con numpy v1.17)
Años más tarde, es hora de elegir 40000 de 10000 ^ 2 (Numpy 1.8.1, imac 2.7 GHz):
import random
import numpy as np
n = 10000
k = 4
np.random.seed( 0 )
%timeit np.random.choice( n**2, k * n, replace=True ) # 536 µs ± 1.58 µs
%timeit np.random.choice( n**2, k * n, replace=False ) # 6.1 s ± 9.91 ms
# https://docs.scipy.org/doc/numpy/reference/random/index.html
randomstate = np.random.default_rng( 0 )
%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=False ) # 766 µs ± 2.18 µs
%timeit randomstate.choice( n**2, k * n, replace=False, shuffle=True ) # 1.05 ms ± 1.41 µs
%timeit random.sample( range( n**2 ), k * n ) # 47.3 ms ± 134 µs
(¿Por qué elegir 40000 de 10000 ^ 2 Para generar grandes?
Scipy.sparse.random
matrices - scipy 1.4.1 usos np.random.choice( replace=False )
., Leeeentos)
Punta del sombrero para la gente numpy.random.
Simplemente genere una matriz que contenga el rango requerido de números, luego revuélvalos intercambiando repetidamente uno aleatorio con el elemento 0 de la matriz. Esto produce una secuencia aleatoria que no contiene valores duplicados.