1

uint8 データの表現について質問があります。

uint8 データが保存されている MATLAB MAT ファイルがあります。

MAT ファイルは Python を使用して読み込まれscipy.io.loadmat()、ディクショナリが形成されます。MAT ファイルのデータ フィールドに対応する配列がディクショナリから抽出されます。配列は次のようになります。

array[[162],[122],...[135],dtype:uint8]

その後、この配列は、後でファイルを読み取るために txt 形式で保存されます。ただし、txt ファイルのデータは倍精度です。たとえば、uint8データ162は として保存され1.620000000000000000e+02ます。あまりにも多くのメモリを占有するため、これは私が望むものではありません。

私が必要としているのは、 の各 1 バイトが1 つのデータsource_file.read()に対応することです。uint8

uint8 データを表現するより良い方法はありますか? uint8 を文字列に変換することは可能ですが、それでも 2 ~ 3 バイトかかります。

4

2 に答える 2

7

おそらく、「18桁の精度を持つ指数形式」を意味するnumpy.savetxtデフォルトのfmt引数を持つ を使用しています。'%.18e'

整数を出力するもの (例: ) に変更することもできますfmt='%d'が、それでもファイル スペースの使用に関してはかなり非効率的です (これは ASCII エンコードされた整数であるため)。

numpy.saveいくつかのヘッダーが含まれていますが、はるかに効率的なバイナリ形式であり、求めているものにはるかに近いです ( format description )。バイナリデータだけが必要な場合は、 tostring dbaapp で提案されているように、次の方法があります。

with open('outfile', 'wb') as f:
    f.write(the_array.tostring())
于 2012-10-22T19:55:47.803 に答える
5

Numpy には、データ構造とバイナリ文字列の間で変換するtostring()とがあります。例えばfromstring()ndarray

> a = numpy.array([162,122,135], dtype=numpy.uint8)
> a.tostring()
'\xa2z\x87'

(その文字列は['\xa2', 'z', '\x87']で、\x..は 1 バイトを表します。)

于 2012-10-22T19:57:38.443 に答える