2012-06-25 3 views
2

Я пытаюсь прочитать двоичный файл, состоящий из 2 байтовых поплавков, но я не могу получить нужные значения. Кажется, что struct.unpack работает только для 4 байтовых поплавков, и я не уверен, что еще доступно, кроме того, что вы делаете полностью вручную. Есть какой-либо способ сделать это? Любая помощь будет очень высоко ценится.Half-Precision (2 байт) cast to Float in Python

+1

Ah, https://en.wikipedia.org/wiki/Half-precision_floating-point_format –

+0

Собственный размер и выравнивание определяются с помощью выражения 'sizeof' компилятора C. Это всегда сочетается с собственным байтовым порядком. Поэтому я не вижу, что вы можете сделать это с помощью текущего структурного модуля, если вы не расширите его, чтобы включить поддержку поплавков Half-Precision. –

+0

Ну, я знаю, что это можно сделать с numpy для целых файлов с помощью: data = np.fromfile (f, dtype = 'uint16') data = self.data.reshape ((len (self.channel_names), - 1), order = 'F'). astype ('float') Но это работает только для целых файлов .... – Cenoc

ответ

8

У вас уже есть большая часть с numpy.fromfile. Вместо того, чтобы использовать numpy.frombuffer:

>>> np.frombuffer(buffer("\0\0"), dtype=np.float16)[0] 
0.0 
>>> np.frombuffer(buffer("\x00\x3c"), dtype=np.float16)[0] 
1.0 

Если данные имеет известную форму, вы можете разобрать структуры, создавая DTYPE с соответствующей планировкой.

+0

работает без 'buffer()': 'np.frombuffer (b '\ x00 \ x3c', dtype = ' jfs

2

Вы можете разместить их до 4-байтовых одноточечных поплавков; Есть несколько людей, которые уже сделали gruntwork для вас:

Они все разобрать формат в это трехсторонним как указано на Wikipedia article on the format, откладывая 2 байта на 4 байта с одним предварительным cision float, а затем передать это обратно в модуль struct python для преобразования этого в float python.