Преобразовать двоичную строку в массив 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.]