numpy.arrayのデータを適切に保存・読み込みするにはどうしたらよいのでしょうか。現在、私は
numpy.savetxt()メソッドを使用しています。例えば、次のような配列
markers` を取得したとします。
.
これを保存しようとすると、次のようになります。
numpy.savetxt('markers.txt', markers)
別のスクリプトでは、以前に保存したファイルを開こうとします。
markers = np.fromfile("markers.txt")
と表示されてしまいます。
.
保存されたデータはまずこんな感じです。
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
しかし、読み込んだばかりのデータを同じメソッド、つまり numpy.savetxt()
を使って保存すると、次のようになります。
1.398043286095131769e-76
1.398043286095288860e-76
1.396426376485745879e-76
1.398043286055061908e-76
1.398043286095288860e-76
1.182950697433698368e-76
1.398043275797188953e-76
1.398043286095288860e-76
1.210894289234927752e-99
1.398040649781712473e-76
何が間違っているのでしょうか?追記 他の "backstage"操作は行っていません。ただ、保存と読み込みをするだけで、このような結果になります。ありがとうございました。
私が見つけた最も信頼できる方法は、np.tofile
で書かれたバイナリファイルに適したnp.fromfile
ではなく、np.loadtxt
と一緒にnp.savetxt
を使うことです。np.fromfileと
np.tofileはバイナリファイルを読み書きするメソッドですが、
np.savetxt`はテキストファイルを書きます。
ですから、例えば
In [1]: a = np.array([1, 2, 3, 4])
In [2]: np.savetxt('test1.txt', a, fmt='%d')
In [3]: b = np.loadtxt('test1.txt', dtype=int)
In [4]: a == b
Out[4]: array([ True, True, True, True], dtype=bool)
あるいは
In [5]: a.tofile('test2.dat')
In [6]: c = np.fromfile('test2.dat', dtype=int)
In [7]: c == a
Out[7]: array([ True, True, True, True], dtype=bool)
私は前者の方法を使用していますが、速度が遅く、ファイルが大きくなることもあります。バイナリ形式はプラットフォームに依存することがあります(例えば、ファイル形式はシステムのエンディアンに依存します)。
NumPyの配列にはプラットフォームに依存しない_フォーマットがあり、np.save
やnp.load
で保存したり読み出したりすることができます。
In [8]: np.save('test3.npy', a) # .npy extension is added if not given
In [9]: d = np.load('test3.npy')
In [10]: a == d
Out[10]: array([ True, True, True, True], dtype=bool)
np.fromfile()
には、sep=
というキーワード引数があります。
ファイルがテキストファイルの場合は、項目間のセパレータを指定します。空のセパレータ(" ")は、ファイルがバイナリとして扱われることを意味します。セパレータ内のスペース (" ") は、0個以上のホワイトスペース文字にマッチします。スペースのみのセパレータは、少なくとも1つのホワイトスペースにマッチしなければなりません。
デフォルト値のsep=""
は、np.fromfile()
がスペースで区切られたテキストファイルではなく、バイナリファイルとして読もうとすることを意味し、無意味な値が返されます。np.fromfile('markers.txt', sep=" ")`を使えば、求めていた結果が得られます。
しかし、他の方が指摘されているように、テキストファイルをnumpy配列に変換するには、np.loadtxt()
が好ましい方法です。また、ファイルが人間に読める必要がない限り、通常は代わりにバイナリ形式を使用する方が良いでしょう(例:np.load()
/np.save()
)。