NumPy parece carecer de compatibilidad integrada para los tipos de 3 y 6 bytes, también conocidos como uint24
y uint48
. Tengo un gran conjunto de datos usando estos tipos y quiero alimentarlo a numpy. Lo que hago actualmente (por uint24):NumPy: tipos de 3 bytes y 6 bytes (también conocido como uint24, uint48)
import numpy as np
dt = np.dtype([('head', '<u2'), ('data', '<u2', (3,))])
# I would like to be able to write
# dt = np.dtype([('head', '<u2'), ('data', '<u3', (2,))])
# dt = np.dtype([('head', '<u2'), ('data', '<u6')])
a = np.memmap("filename", mode='r', dtype=dt)
# convert 3 x 2byte data to 2 x 3byte
# w1 is LSB, w3 is MSB
w1, w2, w3 = a['data'].swapaxes(0,1)
a2 = np.ndarray((2,a.size), dtype='u4')
# 3 LSB
a2[0] = w2 % 256
a2[0] <<= 16
a2[0] += w1
# 3 MSB
a2[1] = w3
a2[1] <<=8
a2[1] += w2 >> 8
# now a2 contains "uint24" matrix
Mientras que funciona para la entrada de 100 MB, parece ineficiente (pensar en 100s GB de datos). ¿Hay una manera más eficiente? Por ejemplo, sería útil crear un tipo especial de vista de solo lectura que enmascare parte de los datos (tipo de "uint64 con dos MSBs siempre cero"). Solo necesito acceso de solo lectura a los datos.
+1 para problemas de alineación. Los problemas no valen la pena. – Joe
Si bien su método se ve mejor, todavía incurre en leer toda la entrada varias veces y almacenar una copia modificada en la memoria. Tanto tu como mi solución original no funcionarán para la entrada de 100GB. –