Python: lectura de archivos binarios de 12 bits

Estoy tratando de leer archivos binarios de 12 bits que contienen imágenes (un video) usando Python 3.

Para leer un archivo similar pero codificado en 16 bits, lo siguiente funciona muy bien:

import numpy as np
images = np.memmap(filename_video, dtype=np.uint16, mode='r', shape=(nb_frames, height, width))

donde filename_video es el archivo y las características nb_frames, alto y ancho del video que se pueden leer desde otro archivo. Por 'trabajar muy bien' quiero decir rápido: leer un video de 640x256 que tiene 140 cuadros toma aproximadamente 1 ms en mi computadora.

Hasta donde sé, no puedo usar esto cuando el archivo está codificado en 12 bits porque no hay un tipo uint12. Entonces, lo que estoy tratando de hacer es leer un archivo de 12 bits y almacenarlo en una matriz uint de 16 bits. Lo siguiente, tomado de (Python: lectura de imagen binaria empaquetada de 12 bits), trabajos:

with open(filename_video, 'rb') as f:
    data=f.read()
images=np.zeros(int(2*len(data)/3),dtype=np.uint16)
ii=0
for jj in range(0,int(len(data))-2,3):
    a=bitstring.Bits(bytes=data[jj:jj+3],length=24)
    images[ii],images[ii+1] = a.unpack('uint:12,uint:12')
    ii=ii+2
images = np.reshape(images,(nb_frames,height,width))

Sin embargo, esto es muy lento: leer un video de 640x256 que solo tiene 5 cuadros toma aproximadamente 11.5 s con mi máquina. Idealmente, me gustaría poder leer archivos de 12 bits tan eficientemente como puedo leer archivos de 8 o 16 bits usando memmap. O al menos no 10 ^ 5 veces más lento. ¿Cómo podría acelerar las cosas?

Aquí hay un ejemplo de archivo:http://s000.tinyupload.com/index.php?file_id=26973488795334213426 (nb_frames = 5, altura = 256, ancho = 640).

Respuestas a la pregunta(3)

Su respuesta a la pregunta