Преобразовать двоичную строку в массив NumPy

Предположим, у меня есть строка:

my_data = '\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@'

Где я получил это не имеет значения, но ради чего-то конкретного, предположим, что я прочитал это из двоичного файла.

Я знаю, что моя строка является двоичным представлением 4 (4-байтовых) чисел с плавающей точкой. Я хотел бы получить эти поплавки в виде массива. Я мог бы сделать:

import struct
import numpy as np
tple = struct.unpack( '4f', my_data )
my_array = np.array( tple, dtype=np.float32 )

Но кажется глупым создавать промежуточный кортеж. Есть ли способ сделать эту операцию без создания промежуточного кортежа?

РЕДАКТИРОВАТЬ

Я также хотел бы иметь возможность построить массив таким образом, чтобы я мог указать порядок строки.

1 ответ

Решение
>>> np.fromstring(b'\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@', dtype='<f4') # or dtype=np.dtype('<f4'), or np.float32 on a little-endian system (which most computers are these days)
array([ 1.,  2.,  3.,  4.], dtype=float32)

Или, если вы хотите big-endian:

>>> np.fromstring(b'\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@', dtype='>f4') # or dtype=np.dtype('>f4'), or np.float32  on a big-endian system
array([  4.60060299e-41,   8.96831017e-44,   2.30485571e-41,
         4.60074312e-41], dtype=float32)

b не обязательно до Python 3, конечно.

Фактически, если вы используете двоичный файл для загрузки данных, вы можете даже пропустить шаг использования строки и загрузить данные непосредственно из файла с помощью команды numpy.fromfile(),

Кроме того, ссылка dtype, на всякий случай: http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html

np.fromstring()устарел. Использовать np.frombuffer() вместо.

import numpy as np

my_data = b'\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@'

# np.fromstring is deprecated
# data = np.fromstring(my_data, np.float32)
data = np.frombuffer(my_data, np.float32)

print(data)
[1. 2. 3. 4.]
Другие вопросы по тегам