Esta página aborda aplicaciones comunes; para obtener la colección completa de rutinas de E / S, consulte Entrada y salida.

Leer texto y CSV archivos

Sin valores perdidos

Usar numpy.loadtxt.

Con valores perdidos

Usar numpy.genfromtxt.

numpy.genfromtxt bien

  • devolver un matriz enmascaradaenmascarar los valores perdidos (si usemask=True), o
  • completa el valor que falta con el valor especificado en filling_values (por defecto es np.nan para float, -1 para int).

Con delimitadores que no son espacios en blanco

>>>print(open("csv.txt").read())1,2,34,,67,8,9
Salida de matriz enmascarada
>>> np.genfromtxt("csv.txt", delimiter=",", usemask=True)  
masked_array(
  data=[[1.0,2.0,3.0],[4.0,--,6.0],[7.0,8.0,9.0]],
  mask=[[False,False,False],[False,True,False],[False,False,False]],
  fill_value=1e+20)
Salida de matriz
>>> np.genfromtxt("csv.txt", delimiter=",")  
array([[1.,2.,3.],[4., nan,6.],[7.,8.,9.]])
Salida de matriz, valor de relleno especificado
>>> np.genfromtxt("csv.txt", delimiter=",", dtype=np.int8, filling_values=99)  
array([[1,2,3],[4,99,6],[7,8,9]], dtype=int8)

Delimitado por espacios en blanco

numpy.genfromtxt también puede analizar archivos de datos delimitados por espacios en blanco que tienen valores perdidos si

  • Cada campo tiene un ancho fijo: Utilice el ancho como delimiter argumento.

    # File with width=4. The data does not have to be justified (for example,# the 2 in row 1), the last column can be less than width (for example, the 6# in row 2), and no delimiting character is required (for instance 8888 and 9# in row 3)>>> f =open("fixedwidth.txt").read()# doctest: +SKIP>>>print(f)# doctest: +SKIP123446788889# Showing spaces as ^>>>print(f.replace(" ","^"))# doctest: +SKIP1^^^2^^^^^^344^^^^^^67^^^88889>>> np.genfromtxt("fixedwidth.txt", delimiter=4)# doctest: +SKIP
    array([[1.000e+00,2.000e+00,3.000e+00],[4.400e+01,       nan,6.000e+00],[7.000e+00,8.888e+03,9.000e+00]])
  • Un valor especial (por ejemplo, “x”) indica que falta un campo: Úselo como missing_values argumento.

    >>>print(open("nan.txt").read())12344 x 6788889>>> np.genfromtxt("nan.txt", missing_values="x")  
    array([[1.000e+00,2.000e+00,3.000e+00],[4.400e+01,       nan,6.000e+00],[7.000e+00,8.888e+03,9.000e+00]])
  • Quieres omitir las filas con valores perdidos: Colocar invalid_raise=False.

    >>>print(open("skip.txt").read())12344678889>>> np.genfromtxt("skip.txt", invalid_raise=False)  
    __main__:1: ConversionWarning: Some errors were detected !
        Line #2 (got 2 columns instead of 3)
    array([[1.,2.,3.],[7.,888.,9.]])
  • El carácter de espacio en blanco delimitador es diferente del espacio en blanco que indica datos faltantes. Por ejemplo, si las columnas están delimitadas por t, los datos faltantes se reconocerán si constan de uno o más espacios.

    >>> f =open("tabs.txt").read()>>>print(f)12344678889# Tabs vs. spaces>>>print(f.replace("t","^"))1^2^344^^67^888^9>>> np.genfromtxt("tabs.txt", delimiter="t", missing_values=" +")  
    array([[1.,2.,3.],[44.,  nan,6.],[7.,888.,9.]])

Leer un archivo en formato .npy o .npz

Opciones:

  • Usar numpy.load. Puede leer archivos generados por cualquiera de numpy.save, numpy.savez, o numpy.savez_compressed.
  • Utilice el mapeo de memoria. Ver numpy.lib.format.open_memmap.

Escribir en un archivo para que NumPy lo vuelva a leer

Binario

Usar numpy.save, o para almacenar múltiples matrices numpy.savez o numpy.savez_compressed.

Para seguridad y portabilidad, colocar allow_pickle=False a menos que el dtype contenga objetos de Python, lo que requiere decapado.

Matrices enmascaradas can't currently be saved, ni tampoco otras subclases de matrices arbitrarias.

Legible por humanos

numpy.save y numpy.savez crear archivos binarios. Para escribir un archivo legible por humanos, usar numpy.savetxt. La matriz solo puede ser de 1 o 2 dimensiones, y no hay “savetxtz” para varios archivos.

Grandes matrices

Ver Escribir o leer matrices grandes.

Leer un archivo binario con formato arbitrario (“blob binario”)

Utilizar una matriz estructurada.

Ejemplo:

los .wav El encabezado del archivo es un bloque de 44 bytes que precede data_size bytes de los datos de sonido reales:

chunk_id         "RIFF"
chunk_size       4-byte unsigned little-endian integer
format"WAVE"
fmt_id           "fmt "
fmt_size         4-byte unsigned little-endian integer
audio_fmt        2-byte unsigned little-endian integer
num_channels     2-byte unsigned little-endian integer
sample_rate      4-byte unsigned little-endian integer
byte_rate        4-byte unsigned little-endian integer
block_align      2-byte unsigned little-endian integer
bits_per_sample  2-byte unsigned little-endian integer
data_id          "data"
data_size        4-byte unsigned little-endian integer

los .wav encabezado del archivo como un dtype estructurado NumPy:

wav_header_dtype = np.dtype([("chunk_id",(bytes,4)),# flexible-sized scalar type, item size 4("chunk_size","),# little-endian unsigned 32-bit integer("format","S4"),# 4-byte string, alternate spelling of (bytes, 4)("fmt_id","S4"),("fmt_size","),("audio_fmt","),#("num_channels","),# .. more of the same ...("sample_rate","),#("byte_rate","),("block_align","),("bits_per_sample","),("data_id","S4"),("data_size","),## the sound data itself cannot be represented here:# it does not have a fixed size])

header = np.fromfile(f, dtype=wave_header_dtype, count=1)[0]

Esta .wav el ejemplo es para ilustración; leer un .wav archivo en la vida real, use el módulo incorporado de Python wave.

(Adaptado de Pauli Virtanen, NumPy avanzado, licenciado bajo CC BY 4.0.)

Escribir o leer matrices grandes

Matrices demasiado grandes para caber en la memoria se pueden tratar como matrices en memoria ordinarias mediante el mapeo de memoria.

  • Datos de matriz sin procesar escritos con numpy.ndarray.tofile o numpy.ndarray.tobytes se puede leer con numpy.memmap:

    array = numpy.memmap("mydata/myarray.arr", mode="r", dtype=np.int16, shape=(1024,1024))
  • Archivos generados por numpy.save (es decir, usando el formato numpy) se puede leer usando numpy.load con el mmap_mode argumento de palabra clave:

    large_array[some_slice]= np.load("path/to/small_array", mmap_mode="r")

El mapeo de memoria carece de funciones como fragmentación y compresión de datos; Los formatos y bibliotecas más completos que se pueden usar con NumPy incluyen:

Para conocer las compensaciones entre memmap, Zarr y HDF5, consulte pythonspeed.com.

Escribir archivos para leer con otras herramientas (que no sean NumPy)

Formatos para intercambiando datos con otras herramientas incluyen HDF5, Zarr y NetCDF (consulte Escribir o leer matrices grandes).

Escribir o leer un archivo JSON

Las matrices NumPy son no directamente JSON serializable.

Guardar / restaurar usando un archivo pickle

Evite cuando sea posible; pepinillos no son seguros contra datos construidos erróneamente o maliciosamente.

Usar numpy.save y numpy.load. Colocar allow_pickle=False, a menos que la matriz dtype incluya objetos Python, en cuyo caso se requiere decapado.

Convierta de un DataFrame de pandas a una matriz NumPy

Ver pandas.DataFrame.to_numpy.

Guardar / restaurar usando tofile y fromfile

En general, prefiera numpy.save y numpy.load.

numpy.ndarray.tofile y numpy.fromfile pierden información sobre endianidad y precisión y, por lo tanto, no son adecuados para nada que no sea almacenamiento desde cero.