【问题标题】:How to read HDF5 files in Python如何在 Python 中读取 HDF5 文件
【发布时间】:2015-03-26 01:49:45
【问题描述】:

我正在尝试从 Python 中的 hdf5 文件中读取数据。我可以使用h5py 读取 hdf5 文件,但我不知道如何访问文件中的数据。

我的代码

import h5py    
import numpy as np    
f1 = h5py.File(file_name,'r+')    

这有效并且文件被读取。但是如何访问文件对象f1 中的数据呢?

【问题讨论】:

  • 如果文件包含 Keras 模型,您可能希望改为 load it with Keras
  • hdf5 文件与hdf 文件不同吗?我有hdfs(它们是几组图像),但我不知道如何打开它们。
  • df = numpy.read_hdf(fileName.hdf5) -> 这会将数据存储到您可以使用的 numpy 数据帧中。

标签: python hdf5


【解决方案1】:

读取文件

import h5py

f = h5py.File(file_name, mode)

通过打印存在的 HDF5 组来研究文件的结构

for key in f.keys():
    print(key) #Names of the groups in HDF5 file.

提取数据

#Get the HDF5 group
group = f[key]

#Checkout what keys are inside that group.
for key in group.keys():
    print(key)

data = group[some_key_inside_the_group][()]
#Do whatever you want with data

#After you are done
f.close()

【讨论】:

  • for key in data.keys(): print(key) #Names of the groups in HDF5 file. 这可以替换为list(data)
  • 了解所有变量使用的确切结构:data.visit(print)
  • @dannykim 完成。
  • 重要:最后需要data.close()
  • 应该是(可怕的新语法):data = group[some_key_inside_the_group][()]
【解决方案2】:

如果您在 hdf 文件中命名了数据集,那么您可以使用以下代码读取和转换 numpy 数组中的这些数据集:

import h5py
file = h5py.File('filename.h5', 'r')

xdata = file.get('xdata')
xdata= np.array(xdata)

如果您的文件在不同的目录中,您可以在'filename.h5'前面添加路径。

【讨论】:

    【解决方案3】:

    读取 HDF5

    import h5py
    filename = "file.hdf5"
    
    with h5py.File(filename, "r") as f:
        # List all groups
        print("Keys: %s" % f.keys())
        a_group_key = list(f.keys())[0]
    
        # Get the data
        data = list(f[a_group_key])
    

    编写 HDF5

    import h5py
    
    # Create random data
    import numpy as np
    data_matrix = np.random.uniform(-1, 1, size=(10, 3))
    
    # Write data to HDF5
    with h5py.File("file.hdf5", "w") as data_file:
        data_file.create_dataset("group_name", data=data_matrix)
    

    更多信息请参见h5py docs

    替代方案

    对于您的应用程序,以下内容可能很重要:

    • 其他编程语言的支持
    • 读/写性能
    • 紧凑性(文件大小)

    另请参阅:Comparison of data serialization formats

    如果您正在寻找一种制作配置文件的方法,您可能想阅读我的短文Configuration files in Python

    【讨论】:

    • 要将HDF5数据集中的数据作为numpy数组获取,可以f[key].value
    • 截至h5py 2.1 版:“属性Dataset.value 可追溯到 h5py 1.0,已弃用,将在以后的版本中删除。此属性将整个数据集转储到 NumPy数组。使用.value 的代码应更新为使用NumPy 索引,并酌情使用mydataset[...]mydataset[()]。"
    • 我正在使用 Julia 的 hdf5 库,读取操作要快得多(将其作为答案包含在内,但 OP 要求使用 python)。在 h5py 中读取相同的 hdf5 文件需要很长时间,但是在 Julia 中它非常易于管理,值得学习在 Julia 中编程来解决这个问题。我对 Julia 的唯一问题是它不能正确处理以空字符结尾的字符串,这对我来说有点障碍。
    • 评论答案本身,读取版本中的列表操作导致python冻结。如果我只是做 f[a_group_key] 它以适当的速度工作。
    • @demongolem:您不应该使用您已经知道要使用哪一个的所有键的列表。我在这里做了一个独立的例子,需要最少的工作来运行。
    【解决方案4】:

    使用这个问题的一些答案和最新的doc,我能够使用

    提取我的数字数组
    import h5py
    with h5py.File(filename, 'r') as h5f:
        h5x = h5f[list(h5f.keys())[0]]['x'][()]
    

    在我的例子中,'x' 只是 X 坐标。

    【讨论】:

      【解决方案5】:
      from keras.models import load_model 
      
      h= load_model('FILE_NAME.h5')
      

      【讨论】:

      • 这是我们在 Keras 中加载保存的 NN 模型的方式。我认为这个问题更笼统,并且与 Keras 有关。
      • 当你只有一把锤子时,一切看起来都像钉子:-)。
      【解决方案6】:

      这是我刚刚编写的一个简单函数,它读取由 keras 中的 save_weights 函数生成的 .hdf5 文件,并返回一个包含图层名称和权重的 dict:

      def read_hdf5(path):
      
          weights = {}
      
          keys = []
          with h5py.File(path, 'r') as f: # open file
              f.visit(keys.append) # append all keys to list
              for key in keys:
                  if ':' in key: # contains data if ':' in key
                      print(f[key].name)
                      weights[f[key].name] = f[key].value
          return weights
      

      https://gist.github.com/Attila94/fb917e03b04035f3737cc8860d9e9f9b.

      尚未对其进行彻底测试,但可以为我完成这项工作。

      【讨论】:

      • 这个函数似乎显示了.h5文件中的所有内容。谢谢。
      【解决方案7】:

      使用以下代码读取数据并转换为 numpy 数组

      import h5py
      f1 = h5py.File('data_1.h5', 'r')
      list(f1.keys())
      X1 = f1['x']
      y1=f1['y']
      df1= np.array(X1.value)
      dfy1= np.array(y1.value)
      print (df1.shape)
      print (dfy1.shape)
      

      【讨论】:

      • 不要忘记关闭文件,否则文件可能会损坏。
      • 谢谢。这可能是打开 .hdf5 数据文件的最佳方式。
      【解决方案8】:

      要将 .hdf5 文件的内容作为数组读取,您可以执行以下操作

      > import numpy as np 
      > myarray = np.fromfile('file.hdf5', dtype=float)
      > print(myarray)
      

      【讨论】:

        【解决方案9】:

        您需要做的是创建一个数据集。如果您查看快速入门指南,它会告诉您需要使用文件对象来创建数据集。所以,f.create_dataset 然后你就可以读取数据了。这在docs 中有解释。

        【讨论】:

          【解决方案10】:

          你可以使用 Pandas。

          import pandas as pd
          pd.read_hdf(filename,key)
          

          【讨论】:

          • 除非您存储数据帧,否则不应依赖 Pandas 实现。 read_hdf 依赖于 HDF 文件处于一定的结构中;也没有 pd.write_hdf,所以你只能单向使用它。见this post
          • Pandas 确实有书写功能。见pd.DataFrame.to_hdf
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-11-26
          • 2015-03-19
          • 2016-06-18
          • 2019-05-02
          • 2019-12-30
          • 2013-12-12
          • 2015-04-18
          相关资源
          最近更新 更多