有没有办法让一个numpy风格的视图存储在hdf5文件中存储的数组?

时间:2015-01-06 16:50:54

标签: python hdf5 pytables h5py

我必须处理大型3D立方体数据。我想将它们存储在HDF5文件中(使用h5py或pytables)。我经常想要只对这些立方体的一部分进行分析。此部分太大而无法保存在内存中。我希望有一个numpy样式视图我的兴趣,而不是将数据复制到内存(类似于你可以用numpy memmap做)。这可能吗?据我所知,使用h5py执行切片,你会在内存中得到一个numpy数组。

有人问我为什么要这样做,因为无论如何数据必须在某个时刻输入内存。出于必要,我的代码已经逐渐对来自这些多维数据集的数据进行零碎处理,一次将少量内容拉入内存。如果这些函数简单地遍历传递给它们的整个数据集,则这些函数最简单。如果我可以查看磁盘上的数据,我只需将此视图传递给这些函数即可。如果我不能拥有一个视图,我需要编写所有函数,只迭代感兴趣的片段。这将增加代码的复杂性,并使其更有可能在分析期间出现人为错误。

有没有办法在不复制到内存的情况下查看磁盘上的数据?

2 个答案:

答案 0 :(得分:1)

一种可能性是创建一个generator,该itertools逐一产生切片的元素。一旦有了这样的生成器,就可以将其传递给现有代码,然后像往常一样遍历生成器。例如,可以在生成器上使用for循环,就像在切片上使用它一样。生成器不会一次存储所有值,而是根据需要“生成”它们。

您也许可以仅创建所需多维数据集位置的切片,而不能创建数据本身,或者如果您也有太多位置要存储在内存中,则可以通过编程方式生成切片的下一个位置。生成器可以使用这些位置逐一生成它们包含的数据。

假设切片是长方体的(可能是高维的)等价体,则可以使用嵌套的for-range()循环或通过{{3 }}模块来排列对象。

答案 1 :(得分:0)

不可避免的是不将数据集的该部分复制到内存中。 这样做的原因仅仅是因为您请求的是整个部分,而不只是其中的一小部分。 因此,必须将其完整复制。

因此,h5py已经允许您以与NumPy数组相同的方式使用HDF5数据集,因此您将不得不更改代码以仅请求当前所需的数据集中的值。