【发布时间】:2016-06-02 17:41:47
【问题描述】:
h5py(通过 HDF5)为在磁盘上持久化数据集提供的好处和简单的映射非常出色。我对一组文件进行了一些分析,并将结果存储到一个数据集中,每个文件一个。在这一步结束时,我有一组包含二维数组的 h5py.Dataset 对象。数组的列数相同,但行数不同,即 (A,N)、(B,N)、(C,N) 等。
我现在想将这些多个 2D 数组作为单个数组 2D 数组进行访问。也就是说,我想将它们按需读取为形状数组(A+B+C,N)。
为此,h5py.Link 类没有帮助,因为它在 HDF5 节点级别上工作。
这是一些伪代码:
import numpy as np
import h5py
a = h5py.Dataset('a',data=np.random.random((100, 50)))
b = h5py.Dataset('b',data=np.random.random((300, 50)))
c = h5py.Dataset('c',data=np.random.random((253, 50)))
# I want to view these arrays as a single array
combined = magic_array_linker([a,b,c], axis=1)
assert combined.shape == (100+300+253, 50)
出于我的目的,将数组复制到新文件中的建议不起作用。我也愿意在 numpy 级别解决这个问题,但我找不到任何合适的选项 numpy.view 或 numpy.concatenate 可以在不复制数据的情况下工作。
有没有人知道一种方法可以将多个数组视为一组堆叠的数组,而无需从h5py.Dataset 复制?
【问题讨论】:
-
解释更多你想用这些数据做什么('按需读取')以及为什么 numpy 连接(最明显的解决方案)是错误的。
-
是否有令人信服的理由不将所有数据存储在单个 2D
Dataset中,然后使用切片索引访问各个子数组? -
@ali_m,单个数据集分析是基于增量分析生成的,有时也会创建新数据集。如果我必须连接并存储所有数据集,那么每次创建或更改新数据集时我都必须这样做。而且他们一个人可能会经常更换。此外,通过从单独的文件中读取,可以轻松过滤或选择数据集。对于如何链接数据集的任何见解,我将不胜感激。
-
@hpaulj,如果我找不到方法,连接 numpy 数组肯定是我的后备解决方案。例如,如果我在 h5py 数据集上运行
np.concatenate([a, b, c]),这会将它们读入内存吗?如果是这样,那么此解决方案不适用于大量数据。 -
有人对此有什么建议吗?
标签: python arrays numpy dataset h5py