如何向numpy memmap数组添加元数据?

时间:2015-06-24 14:24:41

标签: python arrays numpy dataset mmap

是否可以将少量元数据附加到numpy memmap文件中?

这就是我的全部问题。对于那些感兴趣的人,我的问题的详细信息如下:

我的数据集由一堆图像及其相应的多值标签组成,例如:

图像:50000 x 96 x 96 x 3 uint8s阵列

标签:一个50000 x 5的整数数组

我将这些保存到长度为50000的numpy记录数组中,并且dtype(96,96,3)uint8,(5,)int。这很好,因为我可以使用numpy.lib.format.open_memmap()将这两个数组保存在一个memmap文件中。

缺少的一件事是能够向文件添加少量元数据。具体来说,我想将前N个条目指定为"训练集"剩余的50000 - N个条目作为"测试集"。因此,至少需要将单个int(N)添加到文件中。更一般地说,我想允许任意数量的分区,以及它们的分区名称。例如,对于3个分区,这将需要保存以下附加数据:

partition_names = ["testing set", "validation set", "training set"]
partition_sizes = [30000, 10000, 10000]  # last number redundant

有没有办法将此元数据添加到memmap文件中,同时保留使用numpy.lib.open_memmap()或类似方便的内容映射文件的能力?

PS:我曾经使用h5py,这显然更适合存储这样的附加数据,但是在读取大图像时,与numpy memmaps相比,它的性能变得非常糟糕。

2 个答案:

答案 0 :(得分:0)

正如您在问题中所述,HDF5(或NetCDF)将是一种更适合存储具有多个数组,元数据等的复杂数据集的格式。

开发了HDF5,并用于许多高性能应用。如果你使用numpy memmap得到更糟糕的结果,这可能意味着你没有有效地使用它。

查看PyTables,例如blosc compression(参见例如this post)。如果有必要,您可以根据optimization tips中的说明微调一些事项(特别参见图3)。

答案 1 :(得分:0)

看起来像是一个非零的memmap关键字arg offset和一些二进制文件编辑的组合就可以了。