NumPy 配列をそのままのバイナリ形式でファイルに保存することができます.ひとつのベクトル形式や行列形式の配列は np.save()
を使って拡張子が .npy
のファイルに保存します.複数の配列をまとめて保存するには,np.savez()
を使い,このときは拡張子が .npz
になります.ファイルを読み込むときにはその形式に関わらず np.load()
を使います.
なお,CSVファイル等の形式で保存するのであれば Pandas を使う方法もあります.
まず,1次元配列 w
を定義して,ファイル名「w.npy
」で保存します.
w = np.array([50, 60, 70, 80, 90, 100])
print(w)
np.save("w.npy", w)
[ 50 60 70 80 90 100]
保存したデータを読み込んで w1
に格納します.全く同じ形式で読み込めていることがわかりました.
w1 = np.load("w.npy")
print(w1)
[ 50 60 70 80 90 100]
行列形式の2次元配列も同様です.行列 x
を定義してファイル名「x.npy
」で保存します.
x = np.array([
[0, 1, 0, 0, 1, 1],
[0, 1, 1, 1, 0, 0],
[1, 1, 0, 0, 0, 0],
[0, 1, 1, 1, 0, 1]
])
print(x)
np.save("x.npy", x)
[[0 1 0 0 1 1] [0 1 1 1 0 0] [1 1 0 0 0 0] [0 1 1 1 0 1]]
読み込む方法もベクトルデータの場合と全く同じです.
x1 = np.load("x.npy")
print(x1)
[[0 1 0 0 1 1] [0 1 1 1 0 0] [1 1 0 0 0 0] [0 1 1 1 0 1]]
複合データ型を用いた構造化配列であっても同じように保存することができます.
tp = np.dtype([('id', 'u4'), ('name', 'U10'), ('score', 'i8', 4), ('total', 'i8')])
Z = np.zeros(3, dtype=tp)
Z['id'] = np.array([101, 102, 103])
Z['name'] = ['Tanaka', 'Sato', 'Abe']
Z['score'] = np.array([
[30, 60, 55, 40],
[25, 70, 20, 60],
[45, 55, 60, 50]
])
Z['total'] = np.sum(Z['score'], axis=1)
np.save("z.npy", Z)
Z
array([(101, 'Tanaka', [30, 60, 55, 40], 185), (102, 'Sato', [25, 70, 20, 60], 175), (103, 'Abe', [45, 55, 60, 50], 210)], dtype=[('id', '<u4'), ('name', '<U10'), ('score', '<i8', (4,)), ('total', '<i8')])
構造化配列も読み込みが可能で,データ型の定義も読み込みできていることがわかります.
z1 = np.load("z.npy")
z1
array([(101, 'Tanaka', [30, 60, 55, 40], 185), (102, 'Sato', [25, 70, 20, 60], 175), (103, 'Abe', [45, 55, 60, 50], 210)], dtype=[('id', '<u4'), ('name', '<U10'), ('score', '<i8', (4,)), ('total', '<i8')])
複数の配列を一つのファイルに纏めて保存することもできます.このときには savez()
を用い,保存されるファイル名の拡張子には「.npz
」を指定します.
例えば,ベクトル w
と行列 x
を定義して一つのファイルにまとめて保存します.
w = np.array([50, 60, 70, 80, 90, 100])
x = np.array([
[0, 1, 0, 0, 1, 1],
[0, 1, 1, 1, 0, 0],
[1, 1, 0, 0, 0, 0],
[0, 1, 1, 1, 0, 1]
])
print(w)
print(x)
np.savez('wx.npz', w, x)
[ 50 60 70 80 90 100] [[0 1 0 0 1 1] [0 1 1 1 0 0] [1 1 0 0 0 0] [0 1 1 1 0 1]]
読み込みには配列の場合と同じ np.load()
を使います.
wx = np.load('wx.npz')
print()
ではオブジェクト ID が表示されることになります.
print(wx)
<numpy.lib.npyio.NpzFile object at 0x7fe6e8583550>
保存するときに名前を指定していないので,files
で名前の一覧を取得すると arr_0
, arr_1
のような連番になります.
print(wx.files)
['arr_0', 'arr_1']
名前でアクセスして次のように配列を取り出すことができます.
w1 = wx['arr_0']
print(w1)
[ 50 60 70 80 90 100]
x1 = wx['arr_1']
print(x1)
[[0 1 0 0 1 1] [0 1 1 1 0 0] [1 1 0 0 0 0] [0 1 1 1 0 1]]
上の例では名前が連番になっていてわかりにくいかもしれません.保存するときに名前を指定することも可能です.
np.savez('wx_name.npz', weight=w, x=x)
名前を指定して保存したファイルを読み込みます.
wx_name = np.load('wx_name.npz')
名前の一覧を確認します.
wx_name.files
['weight', 'x']
次のように名前を指定してアクセスできると使いやすいでしょう.
w = wx_name['weight']
print(w)
[ 50 60 70 80 90 100]
x = wx_name['x']
print(x)
[[0 1 0 0 1 1] [0 1 1 1 0 0] [1 1 0 0 0 0] [0 1 1 1 0 1]]