【发布时间】:2015-04-14 18:01:52
【问题描述】:
我想保留一个大型 3d numpy 数组。我的第一种方法是简单地使用pickle,但这似乎导致了一个解释不清的错误。
test_rand = np.random.random((100000,200,50))
with open('models/test.pkl', 'wb') as save_file:
pickle.dump(test_rand, save_file, -1)
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-18-511e30b08440> in <module>()
1 with open('models/test.pkl', 'wb') as save_file:
----> 2 pickle.dump(test_rand, save_file, -1)
3
C:\Users\g1dak02\AppData\Local\Continuum\Anaconda\lib\pickle.pyc in dump(obj, file, protocol)
1368
1369 def dump(obj, file, protocol=None):
-> 1370 Pickler(file, protocol).dump(obj)
1371
1372 def dumps(obj, protocol=None):
C:\Users\g1dak02\AppData\Local\Continuum\Anaconda\lib\pickle.pyc in dump(self, obj)
222 if self.proto >= 2:
223 self.write(PROTO + chr(self.proto))
--> 224 self.save(obj)
225 self.write(STOP)
226
C:\Users\g1dak02\AppData\Local\Continuum\Anaconda\lib\pickle.pyc in save(self, obj)
329
330 # Save the reduce() output and finally memoize the object
--> 331 self.save_reduce(obj=obj, *rv)
332
333 def persistent_id(self, obj):
C:\Users\g1dak02\AppData\Local\Continuum\Anaconda\lib\pickle.pyc in save_reduce(self, func, args, state, listitems, dictitems, obj)
417
418 if state is not None:
--> 419 save(state)
420 write(BUILD)
421
C:\Users\g1dak02\AppData\Local\Continuum\Anaconda\lib\pickle.pyc in save(self, obj)
284 f = self.dispatch.get(t)
285 if f:
--> 286 f(self, obj) # Call unbound method with explicit self
287 return
288
C:\Users\g1dak02\AppData\Local\Continuum\Anaconda\lib\pickle.pyc in save_tuple(self, obj)
560 write(MARK)
561 for element in obj:
--> 562 save(element)
563
564 if id(obj) in memo:
C:\Users\g1dak02\AppData\Local\Continuum\Anaconda\lib\pickle.pyc in save(self, obj)
284 f = self.dispatch.get(t)
285 if f:
--> 286 f(self, obj) # Call unbound method with explicit self
287 return
288
C:\Users\g1dak02\AppData\Local\Continuum\Anaconda\lib\pickle.pyc in save_string(self, obj, pack)
484 self.write(SHORT_BINSTRING + chr(n) + obj)
485 else:
--> 486 self.write(BINSTRING + pack("<i", n) + obj)
487 else:
488 self.write(STRING + repr(obj) + '\n')
error: integer out of range for 'i' format code
所以我的两个问题如下:
- 这个错误究竟发生了什么?
- 我应该如何将阵列保存到磁盘?
我正在使用 Python 2.7.8 和 NumPy 1.9.0。
【问题讨论】:
-
刚刚遇到stackoverflow.com/questions/9619199/…,它给出了#2 的答案:numpy:savez。
-
使用
np.save代替:docs.scipy.org/doc/numpy/reference/generated/numpy.save.html 但是,我不知道您为什么会收到该错误。酸洗大型数组可以正常工作(给定足够的内存来保存中间字符串表示),但为了提高效率,您应该使用pickle.HIGHEST_PROTOCOL。 -
numpy.save 和 numpy.savez 有什么区别?
-
savez用于保存多个数组。save用于保存单个数组。如果您只想转储单个数组,savez使用起来会更复杂。不过,它们在引擎盖下或多或少是相同的。 -
savez将每个变量保存到不同的文件中,并将它们打包为zip存档。