Tengo un archivo binario que contiene los registros de posición de un avión.
Cada registro de aspecto:

0x00: Time, float32
0x04: X, float32 // X axis position
0x08: Y, float32 // Y axis position
0x0C: Elevation, float32
0x10: float32*4 = Quaternion (x,y,z axis and w scalar)
0x20: Distance, float32 (unused)

Por lo que cada registro es de 32 bytes.

Me gustaría tener una Colección de matriz.

En el desplazamiento de 1859 hay un unsigned int 32 (4 bytes) que indica el número de elementos de la matriz. 12019 en mi caso.

No me importa (por ahora) datos de cabecera (antes de offset 1859)

Matriz sólo se inicio en el desplazamiento de 1863 (=1859+4).

He definido mi propia Numpy dtype como

dtype = np.dtype([
    ("time", np.float32),
    ("PosX", np.float32),
    ("PosY", np.float32),
    ("Alt", np.float32),
    ("Qx", np.float32),
    ("Qy", np.float32),
    ("Qz", np.float32),
    ("Qw", np.float32),
    ("dist", np.float32),
])

Y estoy leyendo archivo con fromfile:

a_bytes = np.fromfile(filename, dtype=dtype)

Pero no veo ningún parámetro para proporcionar a fromfile para pasar de desplazamiento.

OriginalEl autor scls | 2015-05-08

2 Comentarios

  1. 12

    Puede abrir el archivo con un estándar de python abrir archivo, luego buscar a saltar de la cabecera, a continuación, pasar el archivo objeto para fromfile. Algo como esto:

    import numpy as np
    import os
    
    dtype = np.dtype([
        ("time", np.float32),
        ("PosX", np.float32),
        ("PosY", np.float32),
        ("Alt", np.float32),
        ("Qx", np.float32),
        ("Qy", np.float32),
        ("Qz", np.float32),
        ("Qw", np.float32),
        ("dist", np.float32),
    ])
    
    f = open("myfile", "rb")
    f.seek(1863, os.SEEK_SET)
    
    data = np.fromfile(f, dtype=dtype)
    print x 
    Gracias. Solucionado mi problema. También me di cuenta de data = np.memmap(filename, dtype=dtype, mode='r', offset=offset_array, shape=N) `
    a la derecha, si es un archivo de gran tamaño a continuación, el memmap puede ser el camino a seguir.

    OriginalEl autor reptilicus

  2. 3

    Me enfrenté a un problema similar, pero ninguna de las respuestas anteriores me ha satisfecho.
    Yo necesarios para implementar algo como tabla virtual con un gran número de registros binarios que potencialmente ocupada más memoria de la que me puedo permitir en un numpy matriz. Así que mi pregunta era cómo leer y escribir un pequeño conjunto de números enteros desde/a un archivo binario – un subconjunto de un archivo en un subconjunto de numpy matriz.

    Esta es una solución que funcionó para mí:

    import numpy as np
    recordLen = 10 # number of int64's per record
    recordSize = recordLen * 8 # size of a record in bytes
    memArray = np.zeros(recordLen, dtype=np.int64) # a buffer for 1 record
    
    # Create a binary file and open it for write+read
    with open('BinaryFile.dat', 'w+b') as file:
        # Writing the array into the file as record recordNo:
        recordNo = 200 # the index of a target record in the file
        file.seek(recordSize * recordNo)
        bytes = memArray.tobytes()
        file.write(bytes)
    
        # Reading a record recordNo from file into the memArray
        file.seek(recordSize * recordNo)
        bytes = file.read(recordSize)
        memArray = np.frombuffer(bytes, dtype=np.int64).copy()
        # Note copy() added to make the memArray mutable

    OriginalEl autor Eugene Veselov

Dejar respuesta

Please enter your comment!
Please enter your name here