¿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.choiceofrece un replaceargumento 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 GeneratorAPI, 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 replaceargumento en la numpy.random.choicefunció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 rangeobjeto 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 rangecon xrangepara obtener un comportamiento similar.
Creo numpy.random.sampleque 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.
nuso 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.