はじめに
numpy の配列を保存して読み込む.numpy.save
と numpy.load
事が足りそうだ.
ここでは,dict型のデータを扱う.
目的
numpy でデータを保存する.データの作成条件等を dict型で保存したい.
実験
失敗するコード
動きそうだがうまくいかないコード
import numpy as np
a = {'A':1, 'B':2, 'c':3}
np.save('test.npy', a)
b = np.load('test.npy')
print(b['B'])
エラー箇所
-
np.load
でValueError
-
b['B']
でIndexError
配列a
の確認
a
は dict型
a, type(a)
# ({'A': 1, 'B': 2, 'c': 3}, dict)
allow_pickle
パラメータ
numpy.save
とnumpy.load
では,必要であれば,Pythonのモジュールであるpickleを使用して配列情報を保存する.
関数 | 省略 | 初期値 |
---|---|---|
numpy.save |
可 | True |
numpy.load |
可 | False |
numpy.load によると,version 1.16.3 にallow_pickle = False
が標準になったらしい.
allow_pickle: bool, optional
Changed in version 1.16.3: Made default False in response to CVE-2019-6446.
改良したコード
b = np.load('test.npy', allow_pickle=True)
numpy オブジェクトと辞書
b['B']
で'IndexError'
b
は dict型っぽく見えるが,実は object 型.
b = np.load('test.npy', allow_pickle=True)
b
# array({'A': 1, 'B': 2, 'c': 3}, dtype=object)
改良コード.
numpy.ndarray.item
item
を使って値を取り出す.
d = b.item()
d['B']
# 2
まとめ
動作するコード
a = np.array({'A':1, 'B':2, 'c':3})
np.save('test.npy', a)
b = np.load('test.npy', allow_pickle=True)
d = b.item()
print(d['B'])
# 2