【问题标题】:Read HDF5 dataset of multiple data types读取多种数据类型的 HDF5 数据集
【发布时间】:2019-08-02 03:30:00
【问题描述】:

我有一个 HDF5 文件数据集,其中包含不同的数据类型(int 和 float)。

在 numpy 数组中读取它时,它会将其检测为 np.void 类型的数组。

import numpy as np
import h5py

f = h5py.File('Sample.h5', 'r')
array = np.array(f['/Group1/Dataset'])
print(array.dtype)

Image of the data types {print(array.dtype)}

如何将此数据集读入数组,每列的数据类型与输入的数据类型相同?提前感谢您的回复

【问题讨论】:

  • 如图所示,数组中的数据与 HDF5 数据集的类型相同。在这种情况下,ID 和 DOMAIN_ID 是整数 (i8),其他 XR、YR、ZR 等是实数/浮点数 (f8)。当存在混合数据类型时,使用结构化数组或记录数组。 (这些数组相似但不相同。)现在,如果您想要一个所有数据类型都相同的 ndarray,您将必须从 HDF5 数据集或上面提取的数组中切片数据的子集(使用适当的索引) 我将尝试创建一个示例(没有 HDF5 文件很难做到)。
  • 只需按名称访问数组的每个field(不是列)。 array['ID'], array['RXI'].
  • 我会使用 arr = f['/Group1/Dataset'][:] 语法加载数据集。根据h5py 文档,这是首选方式。无论哪种方式,您都会在 dtype 和布局中获得与 dataset 匹配的结构化数组。

标签: hdf5 h5py


【解决方案1】:

这里有 2 个简单的示例,展示了使用 HDF5 字段/列名称对数据集子集进行切片的两种方法。

第一种方法在访问数据集时通过切片将数据的子集提取到记录数组中。 第二种方法遵循您当前的方法。它将整个数据集提取到一个记录数组中,然后切片一个新视图以访问数据的子集。

大量使用打印语句,因此您可以看到发生了什么。

方法一

real_array= np.array(f['/Group1/Dataset'][:,'XR','YR','ZR'])
print(real_array.dtype)
print(real_array.shape)

方法二

cmplx_array = np.array(f['/Group1/Dataset'])
print(cmplx_array.dtype)
print(cmplx_array.shape)

disp_real = cmplx_array[['XR','YR','ZR']]
print(disp_real.dtype)
print(disp_real.shape)

查看此 SO 主题,了解有关将值从 recarray 复制到 ndarray 并返回的更多见解。

copy-numpy-recarray-to-ndarray

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 2014-09-12
    • 2019-08-14
    • 2016-10-27
    • 2022-10-12
    • 2021-02-24
    • 2019-03-04
    • 2019-06-24
    • 1970-01-01
    相关资源
    最近更新 更多