将复杂词典保存到文件中的最佳方法是什么?

2024-04-19 19:28:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典,里面有元组键和numpy数组值。我试着用h5和pickle保存它,但是收到了错误消息。将此对象保存到文件的最佳方法是什么?在

import numpy as np
from collections import defaultdict
Q =defaultdict(lambda: np.zeros(2))
Q[(1,2,False)] = np.array([1,2])
Q[(1,3,True)] = np.array([3,4])

>>> Q
defaultdict(<function <lambda> at 0x10c51ce18>, {(1, 2, False): array([1, 2]), (1, 3, True): array([3, 4])})

在np.保存回溯:

^{pr2}$

Tags: lambdaimportnumpyfalsetrue消息字典错误
2条回答

我看不出使用pickle有任何问题

import pickle
import numpy as np

x = {(1,2,False): np.array([1,4]), (1,3,False): np.array([4,5])}

with open('filename.pickle', 'wb') as handle:
    pickle.dump(x, handle, protocol=pickle.HIGHEST_PROTOCOL)
with open('filename.pickle', 'rb') as handle:
    y = pickle.load(handle)

print x
print y

编辑后:

您实际拥有的是一个lambda,并且在默认情况下不能进行pickle。您需要安装dill并导入它才能正常工作(请参见this answer

它应该是这样的:

^{pr2}$

输出:

# no errors :-)
defaultdict(<function <lambda> at 0x000000000CD0C898>, {})
defaultdict(<function <lambda> at 0x0000000002614C88>, {})

OP的解决方案: 您编辑的解决方案仍然为我生成了相同的错误,但这很好:

import pickle
import dill
dill_file = open("Q.pickle", "wb")
dill_file.write(dill.dumps(Q))
dill_file.close()

在我的机器上(win8.1 64位,使用Spyder),我在使用simple dill时没有错误。

把它存为普通字典怎么样?保存期间不需要defaultdict行为。在

In [126]: from collections import defaultdict
In [127]: Q =defaultdict(lambda: np.zeros(2))
     ...: Q[(1,2,False)] = np.array([1,2])
     ...: Q[(1,3,True)] = np.array([3,4])
     ...: Q[(3,4,False)]
     ...: 
Out[127]: array([0., 0.])
In [128]: Q
Out[128]: 
defaultdict(<function __main__.<lambda>>,
            {(1, 2, False): array([1, 2]),
             (1, 3, True): array([3, 4]),
             (3, 4, False): array([0., 0.])})

我们可以将其从defaultdict包装中拉出:

^{pr2}$

然后我们可以对它进行pickle(我使用np.save作为pickle快捷方式)

In [131]: np.save('stack49963862', np.array(dict(Q)))

load给出一个包含此字典的对象数组:

In [132]: P = np.load('stack49963862.npy')
In [133]: P
Out[133]: 
array({(1, 2, False): array([1, 2]), (1, 3, True): array([3, 4]), (3, 4, False): array([0., 0.])},
      dtype=object)

In [138]: P.item()
Out[138]: 
{(1, 2, False): array([1, 2]),
 (1, 3, True): array([3, 4]),
 (3, 4, False): array([0., 0.])}

我们可以通过更新轻松地重新创建defaultdict:

In [134]: Q1 =defaultdict(lambda: np.zeros(2))
In [139]: Q1.update(P.item())
In [140]: Q1
Out[140]: 
defaultdict(<function __main__.<lambda>>,
            {(1, 2, False): array([1, 2]),
             (1, 3, True): array([3, 4]),
             (3, 4, False): array([0., 0.])})

相关问题 更多 >