こんにちは!インストラクターのフクロウです!
NumPyはnp.arrayという配列クラスを使った強力な行列計算ライブラリです。
科学計算の実装で使える便利で高速な関数がたくさん実装されていて、その中にはもちろんデータの読み込みや書き込み用の関数もあります。
さて、この記事ではCSVファイルやTSVファイルなどのファイルにデータを保存する「np.savetxt」について紹介します。
CSV/TSVファイルならば、Python以外の言語からでもデータを読み込むことができるので、RやJavaなどの別言語との連携が簡単です。
np.savetxtとは
np.savetxtはNumPyからCSVファイルなどのファイルを作成する関数です。
パラメータを変更することで、カンマ( , )で区切るCSVファイルだけでなく、タブ( t )で区切るTSVファイルも作成できます。
また、よくあるCSVファイルのように、先頭の数行にデータの解説を書くようなこともできます。
np.savetxt( frame="test.csv", # ファイル名 x = data, # 保存するデータ fmt="%.18e", # 有効数字 delimiter=",", # 区切り文字 newline="n", # 行の区切り文字 header="", # ファイルの先頭に書き込む文字列 footer="", # ファイルの最後に書き込む文字列 comments="#", # header/footerの先頭に書かれる文字 )
この関数で大切なのは最初の2つの引数です。
最低限、この2つだけ指定してあげればファイルを作成することができます。
また、浮動小数点数の精度をどうしているか(float32とかfloat64のこと)によっては、fmtを書き換えて有効数字を変更することも大切です。
最後に、使い捨てのファイルじゃない場合、CSVファイルを作ったときにそれが何についてのファイルなのかを忘れてしまわないように(結構忘れちゃいます)する必要があります
その場合はheaderに
- 何についてのファイルなのか
- 誰が作ったのか
- いつ作ったのか
- 各列、各行が何を意味するのか
程度の情報を入れておくと、他の人にCSVファイルを渡すときに便利ですよ!
np.savetxtを使ったCSV/TSVファイルの作成
データ作成
まずはデータを作ります。
全ての列の要素の型が同じであれば、簡単にnp.savetxtでCSV/TSVファイルが作成できます。
>>> num_col = 3 >>> num_row = 5 >>> data1 = np.random.normal(size=(num_row, num_col)) >>> data1 array([[ 1.06569228, 0.31596939, 0.06477798], [-0.54669414, 0.24027839, -0.15254126], [-0.24522706, 1.04796651, 0.37502059], [-0.5775777 , -0.3153236 , -0.84426695], [-0.26162637, -0.8169497 , 0.36793744]])
CSVファイルの作成
それではsavetxtを使ってみましょう。
CSVファイルを作るには、delimiter=”,”としてカンマで区切るように指定します。
np.savetxt( "sample.csv", data1, delimiter="," )
これを実行すると、一行目に指定したパスにファイルが作成されます(ここではファイル名だけ指定したので、Pythonを実行したディレクトリにファイルができます)。
そしてできたCSVファイルがこちら↓
いい感じですね。
もしも列ごとに別の有効数字を使いたい場合は、fmtに列数分のフォーマットを書かないといけません。
今回のファイルであれば、あえて明示的にfmtを書くと以下のようになっています。
np.savetxt( "sample.csv", data1, delimiter=",", fmt=["%.18e","%.18e","%.18e",] )
これのfmtに渡しているリストの、任意の列に対応する位置の文字列(フォーマット)を変えることが必要です。
また、CSVの作成・読み込みについては以下の記事で詳しく解説しています。
ぜひご覧ください!
TSVファイルの作成
次に、TSVファイルを作成してみましょう。
TSVファイルを作るには、delimiter=”t”としてタブで区切るように指定します。
np.savetxt( "sample.tsv", data1, delimiter="t", fmt=["%.18e","%.18e","%.18e",] )
このコードで作成できるTSVファイルはこちら↓
区切り文字がカンマから空白(タブ)に変わっていることがわかりますね。
このようにして作りたいファイルを作ることが簡単にできるのがnp.savetxt関数の良いところですね。
まとめ
この記事では、NumPyからCSV/TSVファイルなどが作れるnp.savetxt関数を紹介しました。
もっと複雑なファイルが作りたい場合、保存したい配列のサイズにもよりますが、Pythonの別の関数で作ったほうが楽な場合もあります。
使いどころを考えて、時短できそうなら使っていきたい関数ですね。