今回は、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.loadtextnp.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=True, fix_imports=True, encoding=’ASCII’)

pickleされたオブジェクトや配列を.npyや.npz形式のファイルやpickleされたファイルから読み込みます。

params:

パラメータ名 概要
file ファイル、str
またはファイルのパス
読み込むファイルを指定します。
mmap_mode {None, ‘r+’, ‘r’, ‘w+’, ‘c’}のいずれか (省略可能)初期値None
None以外の値が指定されたとき、指定されたモード(読み込み専用か書き込み専用か両方か)でファイルを読み込みます。このとき、全部のファイルをメモリーに読み込まずいくつかの部分ごとに読み込みます。ファイルサイズが大きいときに便利です。
allow_pickle bool値 (省略可能)初期値True
npyファイルとして保存されているpickleオブジェクトを読み込むかどうかを指定します。
fix_imports (省略可能)初期値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は保存できる。

参考