はじめに
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