【问题标题】:How do I lazily concatenate "numpy ndarray"-like objects for sequential reading?我如何懒惰地连接类似“numpy ndarray”的对象以进行顺序读取?
【发布时间】:2017-05-25 04:05:57
【问题描述】:

我有几个大型 hdf5 文件的列表,每个文件都有一个 4D 数据集。我想在第一个轴上获得它们的串联,例如,一个类似数组的对象,就像所有数据集都被串联一样。我的最终意图是多次沿同一轴顺序读取数据块(例如[0:100,:,:,:][100:200,:,:,:]、...)。

h5py 中的数据集共享 numpy 数组 API 的重要部分,这允许我调用 numpy.concatenate 来完成工作:

files = [h5.File(name, 'r') for name in filenames]
X = np.concatenate([f['data'] for f in files], axis=0)

另一方面,内存布局不一样,它们之间不能共享内存(related question)。唉,concatenate 会急切地将每个类似数组的对象的全部内容复制到一个新数组中,这在我的用例中是我无法接受的。数组连接函数的source code 证实了这一点。

如何获得多个类似数组的对象的串联视图, 不急切地将它们读入内存?就这个视图而言,对这个视图进行切片和索引就像我有一个串联数组一样。

我可以想象编写一个自定义包装器会起作用,但我想知道这样的实现是否已经作为库存在,或者是否有其他解决方案可用并且同样可行。到目前为止,我的搜索没有产生任何此类结果。我也愿意接受针对 h5py 的解决方案。

【问题讨论】:

    标签: python numpy multidimensional-array h5py


    【解决方案1】:

    flist = [f['data'] for f in files]dataset 对象的列表。实际数据位于 h5 文件上,只要这些文件保持打开状态,就可以访问。

    当你这样做时

    arr = np.concatenate(flist, axis=0)
    

    我想concatenate 首先是

    tmep = [np.asarray(a) for a in flist]
    

    即构造一个numpy数组列表。我假设np.asarray(f['data'])f['data'].valuef['data'][:] 相同(正如我两年前在链接的SO 问题中讨论的那样)。我应该做一些时间测试来比较一下

    arr = np.concatenate([a.value for a in flist], axis=0)
    

    flist 是对这些数据集的一种惰性编译,因为数据仍然驻留在文件中,并且只有在您执行更多操作时才能访问。

    [a.value[:,:,:10] for a in flist]
    

    会将每个数据集的一部分加载到内存中;我希望该列表上的连接相当于arr[:,:,:10]

    生成器或生成器推导是惰性求值的一种形式,但我认为在concatenate 中使用之前必须将它们转换为列表。在任何情况下,concatenate 的结果始终是一个数组,其中所有数据都位于一个连续的内存块中。它绝不是驻留在文件中的数据块。

    您需要告诉我们更多有关打算如何处理这个大型串联数据集的信息。作为大纲,我认为您可以构建包含所有数据集切片的数组。您还可以执行我在上一个答案中演示的其他操作 - 但需要花费访问时间。

    【讨论】:

    • 我已经更新了这个问题。我所说的预期连接将是对类数组对象的视图,它绝对不会使用 numpy 的concatenate
    • [100:200,:,:,:] 适用于连接集、仅一个数据集或与两个集重叠的“行”范围?
    • 再次更新。就这个视图而言,在这个视图上的切片和索引操作就像我有一个串联数组一样。我想不出办法让这个更清楚。
    • 我认为您需要编写自己的簿记函数来计算它加载和连接哪些数据集的哪些切片。如果您想了解如何将这样的函数转换为接受索引符号的类,请查看np.lib.index_tricks。如果需要,我可以画出这样的功能。
    猜你喜欢
    • 1970-01-01
    • 2020-11-14
    • 2016-03-01
    • 2016-11-06
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    相关资源
    最近更新 更多