savetxt、loadtxt
前にcsvファイル、tsvファイルの読み書きの方法を解説しました。
それが最近、numpyを使うことでcsvファイル、tsvファイルの読み書きができるという情報を得たので、ちょっと勉強してみましたので解説してきたいと思います。
とりあえずは基本のプログラムから。
今回は2次元配列を使って、X値、Y値となるようなデータを書き出してみましょう。
ということでデータの準備としてはこんな感じ。
import numpy as np
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 5, 3, 4, 0, 9, 6, 2, 8, 7]
data = np.array([x, y])
print(data)
実行結果
[[ 1 2 3 4 5 6 7 8 9 10]
[ 1 5 3 4 0 9 6 2 8 7]]
X値、Y値をそれぞれ変数x、yとし、data = np.array([x, y])とすることでnumpyの2次元配列に変換しつつ、変数dataに格納しました。
このデータをCSVファイル、TSVファイルとして書き出してみましょう。
とりあえず保存してみる
numpyを使ってデータを書き出すのには「np.savetxt(“ファイル名”、データ)」とします。
import numpy as np
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 5, 3, 4, 0, 9, 6, 2, 8, 7]
data = np.array([x, y])
np.savetxt("test.csv", data)
実行結果
確かに書き出せているのですが、19桁の小数になっています。
数値を保存したいだけであれば、別に問題はありませんが、例えば誰かにデータを渡すなんてことを想定して、もう少し少ない桁数で保存してみましょう。
fmt
桁数や数値の表示形式を変えるにはfmtを用います。
fmtは多分format(フォーマット)の略称でしょう。
桁数を変えるには「fmt = “%.X”」として、最後に表示形式(e:指数、f:小数)を追加します。
つまり小数点以下2桁の小数にする場合は「fmt = “%.2f”」となります。
import numpy as np
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 5, 3, 4, 0, 9, 6, 2, 8, 7]
data = np.array([x, y])
np.savetxt("test.csv", data, fmt = "%.2f")
実行結果
最初に表示されたように指数に、ただ小数点以下の桁数を3にする場合は、「fmt = “%.3e”」となります。
import numpy as np
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 5, 3, 4, 0, 9, 6, 2, 8, 7]
data = np.array([x, y])
np.savetxt("test.csv", data, fmt = "%.3e")
実行結果
CSV、TSVファイルとして保存
ファイルを保存する方法は分かったのですが、データ毎はスペースで分けられており、残念ながらCSVファイルとなっていません。
CSVファイルとして保存する方法としては、データの区切り文字を決める「delimiter = “X”」というオプションを入れます。
Xを「,」にすればCSVファイルとなるというわけです。
import numpy as np
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 5, 3, 4, 0, 9, 6, 2, 8, 7]
data = np.array([x, y])
np.savetxt("test.csv", data, delimiter=",", fmt = "%.3e")
実行結果
ちゃんとカンマで区切られ、CSVファイルとなりました。
ということはTSVファイルとして保存するには「delimiter = “X”」のXをタブにすればいいわけです。
ただ「tab」と書いても認識されません。
タブを表すには「\t」とします。
またファイルの拡張子を「.csv」から「.tsv」としておきます。
import numpy as np
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 5, 3, 4, 0, 9, 6, 2, 8, 7]
data = np.array([x, y])
np.savetxt("test.tsv", data, delimiter="\t", fmt = "%.3e")
実行結果
TSVファイルになりました。
ファイルの読み込み
ファイルの読み込みは「np.loadtxt(“ファイル名”)」で行います。
先ほど保存したCSVファイルを読み込んでみましょう。
import numpy as np
input_data = np.loadtxt("test.csv")
print(input_data)
実行結果
[[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
[ 1. 5. 3. 4. 0. 9. 6. 2. 8. 7.]]
指数で保存したのに、整数(点があるから小数?)となっています。
これはnumpyでは数値を認識して最小限必要な形として表示してくれているのだと思います。
ちなみにTSVファイルも同じように開くことができます。
import numpy as np
input_data = np.loadtxt("test.tsv")
print(input_data)
実行結果
[[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
[ 1. 5. 3. 4. 0. 9. 6. 2. 8. 7.]]
CSVファイルもTSVファイルも気にせずに読み込めるのは楽でいいですね。
また今回のように数値だけのデータであれば、一度に変数に格納できるのも楽でいいなと思います。
良かったら使ってみてください。
おまけ:行と列を入れ替える
ファイルを保存するとき、行と列を入れ替えるには「transpose」というコマンドを用います。
import numpy as np
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 5, 3, 4, 0, 9, 6, 2, 8, 7]
data = np.array([x, y]).transpose()
np.savetxt("test.csv", data, delimiter=",", fmt = "%.3e")
実行結果
と言うことで、今回はこんな感じで。
コメント