今回は、NumPyで作成した配列を読み込んだり保存したりすることのできる関数であるnp.load
関数とnp.save
関数について扱っていきます。
ファイルの読み書きをする関数として他にもテキストファイルを使うnp.loadtxt
関数やnp.savetxt
関数があります。この関数では、csvファイルやdatファイル、txt形式のファイルに対応しています。詳しくは以下のページを参考にしてください。
np.loadtxtとnp.savetxtでテキストファイルを読み書きする方法 /features/numpy-loadsavetxt.html
一方で、load
関数やsave
関数は.npy
や.npz
、もしくは.pickle
の拡張子を通して永続化することができます。np.loadtext
やnp.savetxt
では扱えなかった3次以上のndarrayも保存することができ、Pythonから使うだけであれば簡単です。
np.load, np.save関数
np.save関数
まずは、save
関数から見ていきます。APIドキュメントの方から見ていきましょう。
numpy.save(file, arr, allow_pickle=True, fix_imports=True)
.npy形式で配列を保存します。
params:
パラメータ名 | 型 | 概要 |
---|---|---|
file |
ファイルまたはstr またはファイルのパス |
データを保存する先を指定します。拡張子は.npyです。 |
allow_pickle |
bool値 | (省略可能)初期値True Pythonのモジュールであるpickleを使用して配列情報を保存するかどうかを指定します。pickleを使用するといろんなコードが実行できてしまうので、セキュリティの観点からここをFalseにすることがあります。 |
fix_imports |
bool値 | (省略可能)初期値True Python2でも扱えるような形式にするかどうかを指定します。 |
arr |
array_like 配列に相当するオブジェクト |
保存する配列。 |
基本的に引数は必須のものである保存先を指定するfile
と保存したい配列を指定するarr
しか使いません。他の引数は、普段使う分にはあまり覚える必要はありません。
load関数
次はnp.load関数をみてみましょう。APIドキュメントをみてみます。
numpy.load(file, mmap_mode=None, allow_pickle=False, fix_imports=True, encoding=’ASCII’, max_header_size=10000)
pickleされたオブジェクトや配列を.npyや.npz形式のファイルやpickleされたファイルから読み込みます。
params:
パラメータ名 | 型 | 概要 |
---|---|---|
file |
ファイル、str またはファイルのパス |
読み込むファイルを指定します。 |
mmap_mode |
{None, ‘r+’, ‘r’, ‘w+’, ‘c’}のいずれか | (省略可能)初期値None None以外の値が指定されたとき、指定されたモード(読み込み専用か書き込み専用か両方か)でファイルを読み込みます。このとき、全部のファイルをメモリーに読み込まずいくつかの部分ごとに読み込みます。ファイルサイズが大きいときに便利です。 |
allow_pickle |
bool値 | (省略可能)初期値False npyファイルに保存されたpickle化されたオブジェクト配列 の読み込みを許可するかどうかを指定する。データの読み込み時に任意のコードを実行してしまうことを避けるセキュリティ上の理由で許可しないことがあります。 |
fix_imports |
bool値 | (省略可能)初期値True Python2でpickleされたファイルを読み込む際に使います。 |
encoding |
str | (省略可能)初期値’SCII’ Python2で作成されたstringsを読み込む際にどの文字コードで読み込むかを指定します。 |
returns:
ファイルから読み込まれたデータを格納した配列を返します。
若干引数が多めですが、基本的にはfile
しか使いません。Python2でpickleされたファイルを扱う場合はfix_importsやencodingなどの引数を使う必要があります。
サンプルコード
2つの関数のAPIドキュメントを見たところで、実際のコードで使い方をみてみましょう。特に何も指定せずに保存、読み込みをしてみます。
In [1]: import numpy as np
In [2]: a = np.random.randn(1200*1000).reshape(1200, -1) # ちょっと大きめの配列を生成。
In [3]: np.save('a',a)
In [4]: np.load('a.npy') # 保存したファイルを呼び出してみる。
Out[4]:
array([[-0.21398039, -0.26776404, -1.10086541, ..., -0.00874993,
-0.72319264, -0.51598215],
[ 0.63184673, -0.07852518, 0.19553383, ..., 0.15033086,
-0.46600661, -2.69931554],
[-0.52330208, 0.84120985, 0.17174038, ..., -2.14365796,
2.19237158, 1.79104696],
...,
[ 2.0109805 , -1.07083399, 0.48518804, ..., 0.2508806 ,
0.14586021, -0.03304615],
[-0.303124 , 1.455827 , -1.70351728, ..., -0.35798918,
1.58877739, 1.2085475 ],
[-0.5587845 , -0.53981665, 0.04335222, ..., -0.73698037,
0.79742282, -0.45071473]])
In [5]: a.shape
Out[5]: (1200, 1000)
In [6]: b = np.load('a.npy') # 保存したファイルを他の変数に格納。
In [7]: b.shape # 形状(shape)がaと一致しているのでちゃんと読み込めていることがわかる。
Out[7]: (1200, 1000)
In [9]: c = np.random.randn(12*20*40).reshape(12, 20, 40) # 今度は3次元で
In [10]: np.save('c',c)
In [11]: d = np.load('c.npy')
In [12]: d.shape
Out[12]: (12, 20, 40)
np.loadtxtだと.npyのファイルを読み込むことはできず、np.savetxtだと3次元配列を保存することはできません。
In [13]: e = np.loadtxt('c.npy') # loadtxtでは読み込むことができない。
---------------------------------------------------------(エラーメッセージが表示される)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte
In [14]: np.savetxt('c.npy', c) # savetxtだと3次元配列であるcを格納できない。
---------------------------------------------------------
(エラーメッセージが表示される)
TypeError: only length-1 arrays can be converted to Python scalars
In [17]: np.savetxt('a.txt',a) # 2次元配列のaは保存できる。