我是Python的新手。我试图保存我的结果但失败了。有人可以帮我纠正我的代码吗?
parameter = k ##(k is an number)
L = [(1,matrix1), (2,matrix2), (2,matrix2),...]
首先我创建一个字典来放置我的结果
My_dict = {'parameter':k, 'my_list': L}
我使用以下代码保存并阅读:
import pickle
output = open('result.pkl', 'wb')
pickle.dump(My_dict, output, -1)
output.close()
(我在这里检查我的字典,到现在为止一切都是正确的)
但是当我尝试阅读我的数据时:
pkl_file = open('result.pkl', 'rb')
res = pickle.load(pkl_file)
pprint.pprint(res)
我发现我的L是空的,如下所示:
'parameter': k,
'L': []
我的部分代码错了吗?请帮忙吗?
答案 0 :(得分:0)
我认为问题是我的矩阵是numpy数组。似乎我不应该使用pickle来保存numpy数组。
答案 1 :(得分:0)
我不确定为什么你在挑选numpy
数组或矩阵对象时遇到问题。他们应该泡菜。在这里,我使用dill
来腌制它们。
>>> import dill
>>> n = numpy.array([[1,2,3],[4,5,6]])
>>> m = numpy.matrix(n)
>>> m
matrix([[1, 2, 3],
[4, 5, 6]])
>>> dill.dumps(n)
'\x80\x02cdill.dill\n_create_array\nq\x00(cnumpy.core.multiarray\n_reconstruct\nq\x01cnumpy\nndarray\nq\x02K\x00\x85q\x03U\x01bq\x04\x87q\x05(K\x01K\x02K\x03\x86q\x06cnumpy\ndtype\nq\x07U\x02i8q\x08K\x00K\x01\x87q\tRq\n(K\x03U\x01<q\x0bNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x0cb\x89U0\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00q\rtq\x0eNtq\x0fRq\x10.'
>>> dill.dumps(m)
'\x80\x02cdill.dill\n_create_array\nq\x00(cnumpy.core.multiarray\n_reconstruct\nq\x01cnumpy.matrixlib.defmatrix\nmatrix\nq\x02K\x00\x85q\x03U\x01bq\x04\x87q\x05(K\x01K\x02K\x03\x86q\x06cnumpy\ndtype\nq\x07U\x02i8q\x08K\x00K\x01\x87q\tRq\n(K\x03U\x01<q\x0bNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x0cb\x89U0\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00q\rtq\x0e}q\x0fU\x08_getitemq\x10\x89stq\x11Rq\x12.'
首选方法是使用dump
对象附带的numpy
方法。你可以从上面的pickle中看到,这基本上是dill
正在做的事情,但只是在开头添加了一些小东西(基本上,它还将函数序列化以取消对数组的去除)。
>>> n.dumps()
'\x80\x02cnumpy.core.multiarray\n_reconstruct\nq\x01cnumpy\nndarray\nq\x02K\x00\x85U\x01b\x87Rq\x03(K\x01K\x02K\x03\x86cnumpy\ndtype\nq\x04U\x02i8K\x00K\x01\x87Rq\x05(K\x03U\x01<NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tb\x89U0\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00tb.'
>>> m.dumps()
'\x80\x02cnumpy.core.multiarray\n_reconstruct\nq\x01cnumpy.matrixlib.defmatrix\nmatrix\nq\x02K\x00\x85U\x01b\x87Rq\x03(K\x01K\x02K\x03\x86cnumpy\ndtype\nq\x04U\x02i8K\x00K\x01\x87Rq\x05(K\x03U\x01<NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tb\x89U0\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00tb.'
因此,如果pickle
本身不能直接使用numpy
个对象,则可以使用dill
,也可以使用dump
/ {{1 dumps
对象本身的方法。