web-dev-qa-db-fra.com

convertir une chaîne binaire en tableau numpy

Supposons que j'ai la chaîne:

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

Où je l'ai obtenu n'a pas d'importance, mais pour avoir quelque chose de concret, supposons que je l'ai lu à partir d'un fichier binaire.

Je sais que ma chaîne est la représentation binaire de 4 (4 octets) flottants. Je voudrais obtenir ces flotteurs sous forme de tableau numpy. Je pourrais faire:

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

Mais il semble idiot de créer un Tuple intermédiaire. Existe-t-il un moyen de faire cette opération sans créer de tuple intermédiaire?

MODIFIER

Je voudrais également pouvoir construire le tableau de telle manière que je puisse spécifier l'endianness de la chaîne.

26
mgilson
>>> 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)

Ou, si vous voulez du 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)

Le b n'est pas nécessaire avant Python 3, bien sûr.

En fait, si vous utilisez réellement un fichier binaire pour charger les données, vous pouvez même ignorer l'étape using-a-string et charger les données directement à partir du fichier avec numpy.fromfile().

Aussi, référence dtype, juste au cas où: http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html

38
JAB