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.
>>> 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