ejecutar np.empty por segunda vez

En los documentos Scipy escritos que:

La función ceros crea una matriz llena de ceros, la función crea una matriz llena de unos y la función vacía crea una matriz cuyo contenido inicial es aleatorio y depende del estado de la memoria. Por defecto, el dtype de la matriz creada es float64.

Así que me encontré con este código:

import numpy as np np.empty((1,2)) 

Y está de vuelta:

 array([[ 6.92892901e-310, 8.42664136e-317]]) 

Así que es devolver números aleatorios y todas las cosas son geniales.

Pero, cuando estaba ejecutando ese código por segunda vez (en ese shell), devuelve una matriz cero.

 np.empty((1,2)) array([[ 0., 0.]]) 

Y aquí está la pregunta, ¿por qué devuelve una matriz cero en la segunda vez (en lugar de un número aleatorio)?

No es aleatorio, depende de lo que se guardó en los bytes en la memoria que su computadora le dio a NumPy cuando solicita algo de espacio para la matriz. Si hay algo más que ceros allí, estos se interpretarán con el tipo de letra solicitado (aparentemente aleatorio, pero una palabra mejor sería impredecible).

En su ejemplo, no guardó la primera matriz, por lo que la memoria de la primera matriz se reutilizó de inmediato.

 >>> import numpy as np >>> print(id(np.empty((20)))) 2545385324992 >>> print(id(np.empty((20)))) 2545385324992 

Ahora viene la parte sorprendente: parece que Python (o NumPy o su sistema operativo) pone a cero esa memoria antes de que se la vuelva a poner a NumPy.

Si crea una matriz más grande que no será “cero” porque se toma de otra parte:

 >>> print(np.empty((1, 2))) [[ 1.25757479e-311 1.25757479e-311]] >>> print(np.empty((1, 3))) [[ 4.94065646e-324 9.88131292e-324 1.25757705e-311]] 

La redacción de los documentos parece un poco desafortunada en este caso. No significan aleatorio en el sentido de un generador de números aleatorios adecuado. Si lo último es lo que necesita, puede usar una de las funciones en numpy.random o scipy.stats .

Describir numpy.empty una palabra mejor sería “indefinido”, lo que significa que el usuario no puede hacer suposiciones sobre los valores inicialmente en la matriz devuelta. empty es la forma más económica de crear una matriz si sabe que, de todos modos, sobrescribirá su contenido. La computadora solo tomará algo de memoria para ti. Si esa memoria aún no se utilizó en esa sesión, es probable que aparezca al azar. Pero tu computadora también recicla la memoria.

Tengo que admitir que realmente no sé qué aspecto tiene la memoria reciclada, pero habría dos posibilidades plausibles

  • Contiene lo que el progtwig que usó antes pasó a escribir.
  • O quizás el sistema operativo lo haya sobrescrito con ceros por razones de seguridad.

Cualquier posibilidad explicaría lo que estás viendo.