繁体   English   中英

保存许多不同长度的数组

[英]Saving many arrays of different lengths

我有~8000个二维点数组,存储在内存中作为numpy数组的Python列表。 每个阵列具有形状(x,2) ,其中x是介于~600和~4000之间的数字。 基本上,我有一个锯齿状的3-d阵列。

我想以方便/快速的格式存储这些数据,以便从磁盘读取/写入。 我宁愿不创建~8000个单独的文件,但如果我可以避免它,我也不愿用零填充一个完整的(8000,4000,2)矩阵。

我应该如何将我的数据存储在磁盘上,以便最小化文件大小和解析/序列化?

有一种称为HDF的标准用于存储大量数据集。 您可以在以下链接中找到一些信息,但一般而言,HDF定义了可用于大型信息存储的二进制文件格式。

您可以在此处找到一个在磁盘上存储大型Numpy阵列的示例。 在那篇文章中,作者对Python Pickle和HDF5进行了比较。

我也建议你这样介绍HDF5。 这是 h5py包,它是HDF5二进制数据格式的Pythonic接口。

将所有numpy数组放入一个python列表中,然后picklecPickle列出该列表。

例如:

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作为大型阵列上的速度和跨应用支持(八度,perl等)的优势。 另一方面, pickle的优点是不需要任何额外的软件安装(它包含在python中),并且它本身也理解python对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM