我有大约8000个二维点数组,存储在内存中作为numpy数组的Python列表。每个数组的形状为(x,2)
,其中x
是介于~600和~4000之间的数字。基本上,我有一个锯齿状的三维阵列。
我想以方便/快速的格式存储这些数据,以便从磁盘读取/写入。我宁愿不创建~8000个单独的文件,但如果可以避免的话,我也不愿用零填充一个完整的(8000,4000,2)
矩阵。
我应该如何将数据存储在磁盘上,以便最大限度地减少文件大小和解析/序列化?
答案 0 :(得分:4)
有一种称为HDF的标准用于存储大量数据集。您可以在以下链接中找到一些信息,但一般而言,HDF定义了可用于存储大量信息的二进制文件格式。
您可以找到在磁盘上存储大型Numpy阵列的示例here。在那篇文章中,作者对Python Pickle和HDF5进行了比较。
答案 1 :(得分:1)
将所有numpy数组放入单个python列表中,然后列出pickle或cPickle列表。
例如:
import cPickle
from numpy import array, ones
a = array((5,2))
b = ones((10,2))
c = array((20,2))
all = [a,b,c]
cPickle.dump(all, open('all_my_arrays', 'w'))
然后您可以使用以下方法检索它们:
all2 = cPickle.load(open('all_my_arrays'))
请注意,列表all
不需要任何大量的新内存分配。因为all
只是指向numpy数组的指针列表,所以不需要用零填充或以其他方式复制。
相对于pickle,HDF5作为大型阵列上的速度和跨应用支持(octave,perl等)的优势。另一方面,pickle
的优点是不需要任何额外的软件安装(它包含在python中),它本身也可以理解python对象。