Подтвердить что ты не робот

Конвертировать двоичную строку в массив numpy

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

my_data = '\x00\x00\x80?\x00\x00\[email protected]\x00\[email protected]@\x00\x00\[email protected]'

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

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

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

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

ИЗМЕНИТЬ

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

4b9b3361

Ответ 1

>>> np.fromstring(b'\x00\x00\x80?\x00\x00\[email protected]\x00\[email protected]@\x00\x00\[email protected]', 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\[email protected]\x00\[email protected]@\x00\x00\[email protected]', 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