【问题标题】:Store empty numpy array in h5py在 h5py 中存储空的 numpy 数组
【发布时间】:2014-02-26 06:49:24
【问题描述】:

我想将一些数据写入 HDF5 文件(因为我有大量数据集,并且被告知 HDF5 可以很好地处理这类事情)。

我有一个 Python 2.7 字典,其中包含一些值和一些 numpy 数组。我想做的只是将该字典转储到 HDF5 中。没有分组或其他什么,只需将键值对放入 HDF5。

但是,使用 h5py,如果我将一个空数组(或列表)写入文件,我会得到:

>>> file["test"] = np.array([])
ValueError: zero sized dimension for non-unlimited dimension (Invalid arguments to routine: Bad value)

我不敢相信 HDF5 不允许我将空数组放入其中。碰巧有时我的清单是空的。没办法。

我错过了什么?

谢谢:-)

【问题讨论】:

  • 这对我来说似乎工作正常(使用 h5py v2.2.1)。不过,在我看来,更大的问题是为什么你会想要这样做。请注意,如果您以这种方式初始化数组,其maxshape 属性将为(0,),因此不可能在任何维度上增加其大小以实际存储任何内容。如果你想创建一个可以调整大小以容纳一些实际数据的数据集,我会使用file.create_dataset(..., maxshape=shape, ...) 创建它,其中shape 是一个包含每个维度中数组最大大小的元组。
  • 我不打算稍后更改数据,它应该只是用作数据转储。但有趣的是它对你有用,我稍后会检查我的 numpy 版本。
  • 你的 h5py 版本更可能是相关的
  • @ali_m :就是这样。似乎 h5py v2.0.0 还不支持空数组。如果您发表评论作为答案,我会接受。

标签: python numpy hdf5 h5py


【解决方案1】:

如 cmets 中所述,h5py 2.0.0 不支持大小为零的数组。据我所知,这个功能好像是在this pull request中添加的。

【讨论】:

  • 那个拉取请求是关于切片的。我在使用空列表的 h5py 2.5.0 时遇到了同样的错误,但我无法创建 MWE。
  • @SeppoEnarvi 它似乎可能是那个 PR 或更早的一个,因为 cmets 提到它解决了与零大小数组维度相关的一系列其他问题,并且它还添加了一个单元测试涉及创建一个大小为零的数组。话虽如此,即使使用 v2.0.0,我似乎也无法重现 OP 的错误,所以如果你能想出一个 MWE,那么一定要问另一个问题。
【解决方案2】:

这是我使用的(对你来说可能没有必要,因为你不需要组,但你可能会改变主意):

def save_group(outfile, d, group):
    with h5py.File(outfile, 'a') as g:
        for key in d:
            value = d[key]
            try:
                group.require_dataset(key, value.shape, value.dtype)
            except TypeError as e:
                del group[key]
                group.create_dataset(key, value.shape, value.dtype)
            group[key][...] = value
    return

去掉组参数:

group = g.require_group('/')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-10
    • 2020-07-25
    • 2017-07-28
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 2019-01-06
    相关资源
    最近更新 更多