numpy の save と load で dict を扱う


はじめに

numpy の配列を保存して読み込む.numpy.savenumpy.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.loadValueError
  • b['B']IndexError

配列aの確認

aは dict型

a, type(a)
# ({'A': 1, 'B': 2, 'c': 3}, dict)

allow_pickle パラメータ

numpy.savenumpy.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

参考