web-dev-qa-db-ja.com

Python:numpy.saveで辞書を保存する

numpy arrayおよびdictionariesの形式で、メモリ内に大きなデータセット(数百万行)があります。

このデータを作成したら、ファイルに保存します。そのため、後でこれらのファイルをもう一度スクラッチから再構築することなく、これらのファイルをメモリにすばやく読み込むことができます。

np.saveおよびnp.load関数は、numpy配列に対してスムーズに仕事をします。
しかし、dictオブジェクトの問題に直面しています。

以下のサンプルを参照してください。 d2は、ファイルからロードされた辞書です。 #out [28]を参照してください。d2にはdictとしてではなく、numpy配列としてロードされています。したがって、getなどのdict操作は機能しません。

Numpy配列の代わりにdictからファイルからデータをロードする方法はありますか?

In [25]: d1={'key1':[5,10], 'key2':[50,100]}

In [26]: np.save("d1.npy", d1)

In [27]: d2=np.load("d1.npy")

In [28]: d2
Out[28]: array({'key2': [50, 100], 'key1': [5, 10]}, dtype=object)

In [30]: d1.get('key1')  #original dict before saving into file
Out[30]: [5, 10]

In [31]: d2.get('key2')  #dictionary loaded from the file
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-31-23e02e45bf22> in <module>()
----> 1 d2.get('key2')

AttributeError: 'numpy.ndarray' object has no attribute 'get'
21
ramu

構造化配列です。最初にd2.item()を使用して、実際のdictオブジェクトを取得します。

import numpy as np

d1={'key1':[5,10], 'key2':[50,100]}
np.save("d1.npy", d1)
d2=np.load("d1.npy")
print d1.get('key1')
print d2.item().get('key2')

結果:

[5, 10]
[50, 100]
48
Kennet Celeste

pickle モジュールを使用できます。サンプルコード:

from six.moves import cPickle as pickle #for performance
from __future__ import print_function
import numpy as np

def save_dict(di_, filename_):
    with open(filename_, 'wb') as f:
        pickle.dump(di_, f)

def load_dict(filename_):
    with open(filename_, 'rb') as f:
        ret_di = pickle.load(f)
    return ret_di

if __name__ == '__main__':
    g_data = {
        'm':np.random.Rand(4,4),
        'n':np.random.Rand(2,2,2)
    }
    save_dict(g_data, './data.pkl')
    g_data2 = load_dict('./data.pkl')
    print(g_data['m'] == g_data2['m'])
    print(g_data['n'] == g_data2['n'])

複数のpythonオブジェクトを1つの漬物ファイルに保存することもできます。各pickle.load呼び出しは、その場合に単一のオブジェクトをロードします。

4
Kh40tiK