【问题标题】:What is a fast way in Python to read HDF5 compound dtype arrays?Python 中读取 HDF5 复合 dtype 数组的快速方法是什么?
【发布时间】:2016-05-13 01:39:38
【问题描述】:

我有一个包含 20 个数据集的 HDF5 文件,每个数据集都有 200 行复合 dtype ('<r4', '<r4', '<i4'),其中 dtype 的每个组件代表一个一维变量。我发现打开每个文件并将列的组件分配给它自己的变量大约需要 2 秒,这对我来说似乎非常慢。我正在使用 h5py 和 numpy 打开文件并将其读取到 numpy 数组中:

import numpy as np
import h5py
...
f = h5py.File("foo.hdf5", "r")
set1 = f["foo/bar"]
var1 = np.asarray([row[0] for row in set1])
var2 = np.asarray([row[1] for row in set1])
var3 = np.asarray([row[2] for row in set1])

有没有更快的方法从这些数据集中提取变量?

这是使用 hdfview 的数据集之一的屏幕截图:

【问题讨论】:

  • 你试过var1 = set1[:,0]吗?如果set1dataset,您可以使用与numpy 数组几乎相同的方式对其进行索引。 docs.h5py.org/en/latest/high/dataset.html
  • 是的,我收到错误“TypeError: Argument sequence too long”。此外,如果我尝试set1 = f["foo/bar"][...],然后尝试var1 = set1[:,0],我会收到“IndexError:数组索引过多”
  • 什么是set1.shape?第一个set1group 而不是dataset?我不知道您文件中的数据结构。你必须自己去探索。
  • set1.shape 返回 (200,)
  • 那么 set1 是 1d,所有行没有列。但它可能有一个复杂的dtypeh5py 相当于一个 numpy 结构化数组。我将不得不检查文档。 set1.dtype?

标签: python arrays numpy h5py


【解决方案1】:

一种更快的方法(约 0.05 秒)是将数据集转换为数组,然后按名称引用字段:

import numpy as np
import h5py
...
f = h5py.File("foo.hdf5", "r")
set1 = np.asarray(f["foo/bar"])
var1 = set1["var1"]
var2 = set1["var2"]
var3 = set1["var3"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多