【问题标题】:How do you name the columns in a HDF5 data set?如何命名 HDF5 数据集中的列?
【发布时间】:2020-03-18 19:24:16
【问题描述】:

我在h5py中做了一个数据集:

f = h5py.File("experimentReadings.hdf5", "w")
dset = f.create_dataset("physics", (5,4), dtype='f')

我有一个变量名列表:namesList = ['height', 'mass', 'velocity', 'gravity']

我希望这些变量名是dset 中列的名称。

目前,这些列的名称只有数字 0,1,2,3,如下所示:

我想要这个:

我想我正在寻找这样的代码:

dset[:,0].column_name = namesList[0]
dset[:,1].column_name = namesList[1]
etc...

无论解决方案是什么,它都需要处理我正在使用的真实数据集,其中namesList 的长度为 280,000 个字。

【问题讨论】:

  • h5py 使用 numpy 数组;他们没有列名。如果数组具有混合 dtypes,您可以使用 structured 数组,带有命名字段(而不是列)。但您可能想改用 pandas 数据帧。它使用pytables 将数据保存到HDF5 文件中。
  • @hpaulj 好的,我的数据集是 70,000 行 x 280,000 列,所有数据都是浮点数。 pandas 能处理这么大的数据集吗?

标签: python hdf5 h5py


【解决方案1】:

关于数据集大小的有趣问题。我见过有 10e6 行但不是 280,000 列的 HDF5 文件。您必须进行测试。

关于列/文件的名称,您可以使用记录数组(如 hpaulj 解释的那样)。使用 NumPy dtype 来定义名称。我创建了一些任意数据来填充我的recarray,然后使用data= 参数进行引用。

试试这个:

# Create some data
data1  = np.arange(100.)
data2  = 2.0*data1
data3  = 3.0*data1
data4  = 3.0*data1

# use namesList to define dtype for recarray
namesList = ['height', 'mass', 'velocity', 'gravity']
ds_dt = np.dtype({'names':namesList,'formats':[(float)]*4 }) 

rec_arr = np.rec.fromarrays([data1, data2, data3, data4], dtype=ds_dt)

with h5py.File("experimentReadings.hdf5", "w") as h5f :

    dset = h5f.create_dataset("physics", (100,), data=rec_arr)

【讨论】:

  • 很好,这肯定给出了列名。如何从这个数据集中提取一行数据?例如,我可以通过 dset['mass'] 获得专栏。
  • h5py 数据集的工作就像 numpy 索引。只需使用行索引:dset[0] 用于第一行,dset[-1] 用于最后一行,等等。这会将行中的所有值作为recarray 返回。您也可以使用dset[0]['mass']。 Pytables 有一些很好的方法来查找和选择带有条件测试的行(例如 mass>5.height<100.
  • 优秀。假设你想删除一列..你是怎么做的?
  • 我不确定您是否可以使用 h5py 或 PyTables 从 HDF5 文件中删除数据的列/字段。如果可以,我不知道该怎么做。对不起。
  • unstructured_to_structured 函数 numpy.org/devdocs/user/… 可能也很方便。
猜你喜欢
  • 2017-12-30
  • 2021-04-23
  • 2015-08-01
  • 2019-04-04
  • 2016-06-27
  • 2016-12-08
  • 1970-01-01
  • 2014-09-07
  • 2021-03-20
相关资源
最近更新 更多