NumPy :3 -байта, 6 -типов байтов (, также известных как uint24, uint48)

NumPy, похоже, не имеет встроенного -для поддержки 3 -байт и 6 -байтов, также известных как uint24и uint48. У меня есть большой набор данных, использующий эти типы, и я хочу передать его в numpy. Что я сейчас делаю (для uint24):

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

Хотя он работает для ввода 100 МБ, он выглядит неэффективным (подумайте о 100 ГБ данных ). Есть ли более эффективный способ? Например, было бы полезно создать особый вид представления -только для чтения, который маскирует часть данных (типа «uint64 с двумя старшими битами всегда нулевыми» ). Мне нужно только читать -только доступ к данным.

5
задан Ilia K. 15 August 2012 в 09:59
поделиться