保存多个不同长度的数组

7 投票
2 回答
3628 浏览
提问于 2025-04-17 23:51

我有大约8000个二维点的数组,这些数组存储在内存中,形式是一个包含numpy数组的Python列表。每个数组的形状是(x,2),其中x的值在600到4000之间。简单来说,我有一个不规则的三维数组。

我想把这些数据以方便和快速的方式存储到磁盘上。我不想创建大约8000个单独的文件,但我也不想为了填满一个(8000,4000,2)的矩阵而在里面填充很多零,如果可以避免的话。

我应该如何在磁盘上存储我的数据,以便尽量减少文件大小和解析/序列化的时间呢?

2 个回答

2

把你所有的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对象。

6

有一个标准叫做HDF,用来存储大量的数据集。你可以在下面的链接找到一些信息,但简单来说,HDF定义了一种二进制文件格式,可以用来存放大量的信息。

你可以在这里找到一个例子,讲的是如何在磁盘上存储大型的Numpy数组。在那篇文章中,作者比较了Python的Pickle和HDF5。

我还推荐你看一下这个关于HDF5的介绍。这里有一个叫h5py的包,它是一个Python接口,用来处理HDF5的二进制数据格式。

撰写回答