LoginSignup
10
7

More than 3 years have passed since last update.

numpy の save と load で dict を扱う

Last updated at Posted at 2021-04-13

はじめに

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

参考

10
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7