Estoy esperando que otro desarrollador termine un fragmento de código que devolverá una matriz np de forma (100,2000) con valores de -1,0 o 1.
Mientras tanto, quiero crear aleatoriamente una matriz de las mismas características para poder comenzar con mi desarrollo y pruebas. El caso es que quiero que esta matriz creada aleatoriamente sea la misma cada vez, de modo que no esté probando contra una matriz que sigue cambiando su valor cada vez que vuelvo a ejecutar mi proceso.
Puedo crear mi matriz de esta manera, pero ¿hay alguna manera de crearla para que sea la misma cada vez? Puedo encurtir el objeto y despegarlo, pero me pregunto si hay otra forma.
r = np.random.randint(3, size=(100, 2000)) - 1
numpy.random.seed()
función cuando no estaba prestando atención. :-) Lo dejé intencionalmente fuera del módulo original. Recomiendo que las personas utilicen sus propias instanciasRandomState
y pasen esos objetos.numpy.random.seed()
se desaconseja el uso de , esto debe mencionarse en la documentación . Aparentemente, otros colaboradores de NumPy no comparten la opinión de Robert. Sin ofender en absoluto, solo tengo curiosidad.random.seed
versus usar unrandom.Random
objeto en la biblioteca estándar de Python. Si usarandom.seed
onumpy.random.seed
, está sembrando todas las instancias aleatorias, tanto en su código como en cualquier código al que esté llamando o en cualquier código que se ejecute en la misma sesión que la suya. Si esas cosas dependen de que sean realmente aleatorias, entonces empiezas a tener problemas. Si implementa código que establece la semilla aleatoria, puede introducir una vulnerabilidad de seguridad.Crea tu propia instancia de
numpy.random.RandomState()
con tu semilla elegida. No lo utilicenumpy.random.seed()
excepto para trabajar con bibliotecas inflexibles que no le permiten pasar su propiaRandomState
instancia.[~] |1> from numpy.random import RandomState [~] |2> prng = RandomState(1234567890) [~] |3> prng.randint(-1, 2, size=10) array([ 1, 1, -1, 0, 0, -1, 1, 0, -1, -1]) [~] |4> prng2 = RandomState(1234567890) [~] |5> prng2.randint(-1, 2, size=10) array([ 1, 1, -1, 0, 0, -1, 1, 0, -1, -1])
fuente
numpy.random.seed()
? Sé que no es seguro para subprocesos, pero es realmente conveniente si no necesita seguridad para subprocesos.numpy.random
, no podrá crear flujos independientes más adelante. También es más fácil escribir bibliotecas con la intención de controlar los flujos de PRNG. Siempre hay varias formas de ingresar a su biblioteca, y cada una de ellas debe tener una forma de controlar la semilla. Pasar objetos PRNG es una forma más limpia de hacerlo que confiarnumpy.random.seed()
. Desafortunadamente, este cuadro de comentarios es demasiado corto para contener más ejemplos. :-)numpy.random.RandomState()
sin argumentos. Esto sembrará el estado con valores únicos extraídos de las instalaciones de su sistema operativo para tales cosas (/dev/urandom
en máquinas UNIX y el equivalente de Windows allí). Sinumpy.random.RandomState(1234567890)
no le funciona, muestre exactamente lo que escribió y exactamente el mensaje de error que recibió.numpy.random.RandomState()
sin argumentos para obtener los mejores resultados.Si está utilizando otras funciones que dependen de un estado aleatorio, no puede simplemente establecer una semilla general, sino que debe crear una función para generar su lista aleatoria de números y establecer la semilla como un parámetro de la función. Esto no molestará a ningún otro generador aleatorio en el código:
# Random states def get_states(random_state, low, high, size): rs = np.random.RandomState(random_state) states = rs.randint(low=low, high=high, size=size) return states # Call function states = get_states(random_state=42, low=2, high=28347, size=25)
fuente
Es importante comprender cuál es la semilla de un generador aleatorio y cuándo / cómo se establece en su código (consulte, por ejemplo, aquí para obtener una buena explicación del significado matemático de la semilla).
Para eso necesitas establecer la semilla haciendo:
Entonces es importante generar los números aleatorios de random_state y no de np.random. Es decir, deberías hacer:
en vez de
que creará una nueva instancia de RandomState () y básicamente usará el reloj interno de su computadora para establecer la semilla.
fuente
Solo quiero aclarar algo con respecto a la respuesta de @Robert Kern en caso de que no esté claro. Incluso si usa el
RandomState
, tendría que inicializarlo cada vez que llame a un método aleatorio numpy como en el ejemplo de Robert, de lo contrario obtendrá los siguientes resultados.Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31) [GCC 7.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import numpy as np >>> prng = np.random.RandomState(2019) >>> prng.randint(-1, 2, size=10) array([-1, 1, 0, -1, 1, 1, -1, 0, -1, 1]) >>> prng.randint(-1, 2, size=10) array([-1, -1, -1, 0, -1, -1, 1, 0, -1, -1]) >>> prng.randint(-1, 2, size=10) array([ 0, -1, -1, 0, 1, 1, -1, 1, -1, 1]) >>> prng.randint(-1, 2, size=10) array([ 1, 1, 0, 0, 0, -1, 1, 1, 0, -1])
fuente