web-dev-qa-db-ja.com

バイナリ文字列をnumpy配列に変換します

次の文字列があるとします。

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

どこで取得したかは関係ありませんが、何か具体的にするために、バイナリファイルから読み取ったと仮定します。

私の文字列は4(4バイト)floatのバイナリ表現であることを知っています。私はそれらの浮動小数点数を派手な配列として取得したいと思います。私はできました

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

しかし、中間のタプルを作成するのはばかげているようです。中間タプルを作成せずにこの操作を行う方法はありますか?

[〜#〜]編集[〜#〜]

また、文字列のエンディアンを指定できるように配列を構築できるようにしたいと考えています。

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)
_

または、ビッグエンディアンが必要な場合:

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

38
JAB