Есть ли лучший способ представления данных uint8

У меня вопрос относительно представления данных uint8.

У меня есть файл MATLAB MAT, в котором сохраняются данные uint8.

Файл MAT считывается в Python с использованием scipy.io.loadmat(), и формируется словарь. Массив, соответствующий данным файла MAT, извлекается из словаря. Массив выглядит так:

array[[162],[122],...[135],dtype:uint8]

После этого этот массив сохраняется в формате txt для последующего чтения файла. Однако данные в текстовом файле имеют двойную точность. Например, uint8 данные 162 сохраняются как 1.620000000000000000e+02. Это не то, что я хочу, потому что это займет слишком много памяти.

Мне нужно, чтобы каждый байт из source_file.read() соответствовал одному uint8 данным.

Есть ли лучший способ представить данные uint8? Преобразование uint8 в строку возможно, но все равно занимает 2-3 байта.


person Sheng2012    schedule 22.10.2012    source источник
comment
Какой метод вы используете для сохранения файла?   -  person John Vinyard    schedule 22.10.2012
comment
Почему данные записываются в текстовый файл как с плавающей запятой?   -  person Warren Weckesser    schedule 22.10.2012
comment
@John, раньше я использовал 'numpy.savetxt()' для сохранения массива.   -  person Sheng2012    schedule 23.10.2012
comment
@Warren, как только что упомянул Дугал, аргумент fmt по умолчанию — «%.18e». Вот почему так много цифр.   -  person Sheng2012    schedule 23.10.2012


Ответы (2)


Предположительно, вы используете numpy.savetxt, который по умолчанию fmt аргумент '%.18e', что означает «в экспоненциальном формате с точностью до 18 цифр».

Вы можете изменить его на что-то, что будет выдавать целое число (например, fmt='%d'), но это все еще довольно неэффективно с точки зрения использования файлового пространства (поскольку это целое число в кодировке ASCII).

numpy.save имеет гораздо более эффективный двоичный формат, который намного ближе к тому, что вы просите, хотя он включает в себя некоторые заголовки (описание формата). Если вам нужны только двоичные данные, то tostring как предложено dbaupp, это путь:

with open('outfile', 'wb') as f:
    f.write(the_array.tostring())
person Danica    schedule 22.10.2012
comment
Спасибо, Дугал, и numpy.save, и tostring очень полезны. Как вы сказали, учитывая заголовок, в этом случае tostring кажется еще лучше. - person Sheng2012; 23.10.2012

У Numpy есть tostring() и fromstring(), которые преобразуют структуру данных ndarray в двоичную строку. Например.

> a = numpy.array([162,122,135], dtype=numpy.uint8)
> a.tostring()
'\xa2z\x87'

(Эта строка ['\xa2', 'z', '\x87'], \x.. представляет один байт.)

person huon    schedule 22.10.2012
comment
Спасибо, dbaupp! Это очень полезно! - person Sheng2012; 23.10.2012