配列のファイル入出力

目的

numpyモジュールのndarrayオブジェクトは他の様々なオブジェクトと同様に,pickleファイルとして書き出し,読み込むことができる.それに加えて,csv形式やnumpyモジュールのいくつかの形式でファイルに書き出し,フィルから読み込むことができる.ここでは,numpyモジュールを使用した配列オブジェクトのファイル入出力について学ぶ.

説明

csvファイル

出力

numpyモジュールの配列オブジェクトはテキストデータとして書き出すことができる.

8行目から11行目までで,300人分の5教科のテストの点数を表す2次元配列を作っている.12行目のように,numpyモジュールのsavetxt関数を,第1引数にファイル名,第2引数に配列オブジェクト,キーワード引数delimiterに区切り文字としてカンマを指定して呼び出すと,指定したファイル名のファイルができる.ファイル「scores.csv」を開くと,19桁の浮動小数点数が指数表記で記述され,各数値がカンマで区切られていることがわかる.

入力

改行とカンマで区切って2次元配列を表したテキストデータを読み込んで,2次元配列オブジェクトを作るには,以下のようにすればよい.

6行目で,numpyモジュールのloadtxt関数を,第1引数にファイル名,キーワード引数delimiterにカンマ,dtypeに8ビット符号なし整数型を指定して呼び出すと,ファイルからデータを読み込み,2次元配列オブジェクトを作ることができる.

特徴

配列オブジェクトをテキストファイルに書き出すと,数値データが19桁の浮動小数点を表した文字列として保存される.そのため,上の例のような整数を要素にもつ配列の場合は無駄である.また,浮動小数点数を要素にもつ配列の場合は丸めによって精度が落ちることがある.さらに,2次元配列までしかテキストファイルとして書き出せないため,3次元以上の配列を書き出す場合には平坦化やreshapeを行い,次元数を落とす必要がある.そのような場合には,テキストファイルから読み込んだ際に,元のshapeの戻す処理が必要となる.

npyファイル

出力

numpyモジュールの配列オブジェクトはnpy形式のファイルにバイナリデータとして書き出すことができる.

8行目から12行目で,300人10回分の5教科のテストの点数を表す3次元配列を作っている.13行目のように,numpyモジュールのsave関数を,第1引数にファイル名,第2引数に配列オブジェクトを指定して呼び出すと,npy形式のファイルができる.

入力

npy形式のファイルからバイナリデータを読み込み,配列オブジェクトを生成するには,以下のようにすればよい.

6行目のように,numpyモジュールのload関数をファイル名を引数として指定して呼び出すと,ファイルからデータを読み込み,配列オブジェクトを生成することができる.

特徴

配列オブジェクトをnpy形式のバイナリファイルに書き出すと,丸めにより精度が下がることはない.また,3次元以上の配列もそのまま書き出し,読み込むことができる.

npzファイル

ファイルに書き出したい配列オブジェクトが複数ある場合には,npz形式のファイルに書き出すことができる,

出力

8行目から12行目で300人・10回・5教科のテストの点数の配列を作り,13行目で各教科の平均点を,14行目で各教科の標準偏差を求めている.これら3つの配列オブジェクトを1つのファイルに書き出すには,15行目のように,numpyモジュールのsavez関数を,第1引数にファイル名,第2引数以降に保存したい配列オブジェクトを指定して呼び出せばよい.

入力

npz形式のファイルからバイナリデータを読み込み,複数の配列オブジェクトを作るには以下のようにすればよい.

5行目のようにnumpyモジュールのload関数をnpzファイルのファイル名を引数で指定して呼び出すと,npz形式ファイルのオブジェクトが返される.7行目でnpzファイルオブジェクトの変数filesを表示している.実行結果からわかるように,npz.filesには「arr_0」「arr_1」「arr_2」という文字列が格納されている.これらは3つの配列データを参照する際のキーワード名を表している.9行目から11行目のように記述すると,npzファイルオブジェクトからキーワード名を使用して3つの配列データを取得し,配列オブジェクトを生成することができる.

npzファイル(キーワード名の指定)

上記の例では,npzファイルから配列データを読み込む際に,キーワード名「arr_0」「arr_1」「arr_2」を使用した.このキーワード名を指定してファイルを書き出す方法を確認しよう.

出力

キーワード名を指定して複数の配列オブジェクトをnpzファイルに書き出すには,以下のように記述すればよい.

15行目のように,savez関数のキーワード引数の名前を「scores」「means」「stds」とすると,それらの名前がキーワード名としてファイルに保存される.

入力

7行目でキーワード名を表示すると,実行結果からわかるように「scores」「means」「stds」がキーワード名となっていることがわかる.9行目から11行目のように,キーワード名によって各配列データを取得することができる.

7行目のように記述すると,入力画像の縦と横を入れ替えた画像を作ることができる.

npzファイル(圧縮)

出力

npz形式のファイルは書き出すときに圧縮することができる.

15行目のように,numpyモジュールのsavez_compressed関数を使用すると,圧縮されたnpzファイルが生成される.

入力

圧縮されたnpzファイルから配列データを読み込む方法は,圧縮されていない場合と同様である.

pickleファイル

出力

numpyモジュールの配列オブジェクトは,その他のオブジェクトと同様にpickle形式のファイルとして書き出すこともできる.

17,18行目で3つの配列オブジェクトをリストとしてpickle形式ファイルに書き出している.

入力

pickle形式のファイルからデータを読み込み,配列オブジェクトを生成する方法もその他のオブジェクトと同様である.

5,6行目で,pickle形式のファイルからデータを読み込み,リストをアンパックして3つの配列オブジェクトを生成している.

pickleファイル(他のオブジェクトとともに)

出力

npz形式のファイルには,numpyの配列オブジェクトしか保存できないが,pickle形式のファイルには,配列オブジェクトをその他の様々なオブジェクトとともに保存することができる.

上の例では,17行目でこのプログラムを実行した日時を取得し,18行目でこのプログラムで書き出されるデータの説明文の文字列オブジェクトを生成している.20,21行目で,これらを配列オブジェクトとともにリストとしてpickleファイルに書き出している.

入力

6,7行目のように記述すると,pickle形式のファイルからデータを読み込み,様々なオブジェクトを生成することができる.

課題

課題0

100人分3教科のテストの点数からなる2次元配列をcsv形式のファイルに書き出し,読み込め.

課題1

カラー静止画像を読み込み,画像データをnpy形式のファイルに書き出し,読み込んで,ウィンドウに表示せよ.

課題2

カラー静止画像を読み込み,グレースケール画像に変換し,元の画像データと変換後の画像データをnpz形式のファイルに書き出し,読み込んで,ウィンドウに表示せよ.

課題3

カラー静止画像を読み込み,解像度を変更し,元の画像データと変換後の画像データをnpz形式のファイルに書き出し,読み込んで,ウィンドウに表示せよ.

課題4

カラー静止画像を読み込み,グレースケール画像に変換し,元の画像データと変換後の画像データをnpz形式のファイルに圧縮して書き出し,読み込んで,ウィンドウに表示せよ.また,課題2で書き出したファイルとファイルサイズを比較せよ.

課題5

カラー静止画像を読み込み,解像度を変更し,元の画像データと変換後の画像データをnpz形式のファイルに圧縮して書き出し,読み込んで,ウィンドウに表示せよ.また,課題3で書き出したファイルとファイルサイズを比較せよ.

課題6

カラー静止画像を読み込み,グレースケール画像に変換し,元の画像データと変換後の画像データをpickle形式のファイルに書き出し,読み込んで,ウィンドウに表示せよ.また,課題2,4で書き出したファイルとファイルサイズを比較せよ.

課題7

カラー静止画像を読み込み,解像度を変更し,元の画像データと変換後の画像データをpickle形式のファイルに圧縮して書き出し,読み込んで,ウィンドウに表示せよ.また,課題3,5で書き出したファイルとファイルサイズを比較せよ.

課題8

カラー静止画像を読み込み,グレースケール画像に変換し,元の画像データ・変換後の画像データ・読み込んだ画像ファイルのファイル名・実行日時をpickle形式のファイルに書き出し,読み込んで表示せよ.

課題9

カラー静止画像を読み込み,解像度を変更し,元の画像データ・変換後の画像データ・読み込んだ画像ファイルのファイル名・実行日時をpickle形式のファイルに書き出し,読み込んで表示せよ.