HDF5:如何从数据集中读取数组
HDF5: How to read an array from a dataset
我以前从未见过这个,但我有一个包含 1x1 数据集的文件,其中唯一的值是一个 64 位浮点数组 [3]。我可以使用 HDFView 工具看到这一点,但无论我尝试什么,我都会出错。是否需要创建特殊类型才能使其正常工作?
Edit 如果我使用 H5Sget_simple_extent_npoints()
获取数据点的数量,结果是 1。因此,它看起来是 1 个包含 3 个元素的数组。
我最后尝试的是手动读取 3 个双打:
hid_t dataset = ...; // open the dataset (dataset is valid)
double var[3];
hsize_t memdim[] = { 3 };
hid_t space = H5Screate_simple(1, memdim, nullptr); // (space is valid)
auto rc = H5Dread(dataset, H5T_NATIVE_DOUBLE, space, space, H5P_DEFAULT, &var[0]);
// rc = -1
还尝试只读取整个数据集:
hid_t dataset = ...; // open the dataset (dataset is valid)
double var[3];
auto rc = H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &var[0]);
// rc = -1
上述测试的错误文本:
HDF5-DIAG: Error detected in HDF5 (1.10.5) thread 17272:
#000: \hdf5-1.10.5\src\H5Dio.c line 199 in H5Dread(): can't read data
major: Dataset
minor: Read failed
#001: \hdf5-1.10.5\src\H5Dio.c line 467 in H5D__read(): unable to set up type info
major: Dataset
minor: Unable to initialize object
#002: \hdf5-1.10.5\src\H5Dio.c line 983 in H5D__typeinfo_init(): unable to convert between src and dest datatype
major: Dataset
minor: Feature is unsupported
#003: \hdf5-1.10.5\src\H5T.c line 4546 in H5T_path_find(): can't find datatype conversion path
major: Datatype
minor: Can't get value
#004: \hdf5-1.10.5\src\H5T.c line 4762 in H5T__path_find_real(): no appropriate function for conversion path
major: Datatype
minor: Unable to initialize object
如果您未绑定到特定的 HDF5 库,您可能需要检查 HDFql,因为它大大减轻了您对 HDF5 low-level 详细信息的负担。
要读取和显示数据类型为双精度(64 位)的大小为 3 的一维数组数据集(名为 dset
),可以使用 C++ 中的 HDFql 按如下方式完成:
HDFql::execute("SELECT FROM dset");
while(HDFql::cursorNext() == HDFql::Success)
{
cout << *HDFql::cursorGetBigint() << endl;
}
或者,不使用 HDFql 游标,您可以直接使用数据集 dset
的值填充您的变量,如下所示:
double values[3];
HDFql::variableRegister(&values);
HDFql::execute("SELECT FROM dset INTO MEMORY 0");
for(int i = 0; i < 3; i++)
{
cout << values[i] << endl;
}
我发现可以制作一个数组类型是必需的:
hsize_t size = { 3 };
hid_t type = H5Tarray_create(H5T_NATIVE_DOUBLE, 1, &size);
hid_t dataset = H5Dopen(...);
double var[3];
hsize_t memdim[] = { 1 }; // or how many arrays[3]'s to read
hid_t space = H5Screate_simple(1, memdim, nullptr);
auto rc = H5Dread(dataset, type, space, H5S_ALL, H5P_DEFAULT, &var[0]);
我以前从未见过这个,但我有一个包含 1x1 数据集的文件,其中唯一的值是一个 64 位浮点数组 [3]。我可以使用 HDFView 工具看到这一点,但无论我尝试什么,我都会出错。是否需要创建特殊类型才能使其正常工作?
Edit 如果我使用 H5Sget_simple_extent_npoints()
获取数据点的数量,结果是 1。因此,它看起来是 1 个包含 3 个元素的数组。
我最后尝试的是手动读取 3 个双打:
hid_t dataset = ...; // open the dataset (dataset is valid)
double var[3];
hsize_t memdim[] = { 3 };
hid_t space = H5Screate_simple(1, memdim, nullptr); // (space is valid)
auto rc = H5Dread(dataset, H5T_NATIVE_DOUBLE, space, space, H5P_DEFAULT, &var[0]);
// rc = -1
还尝试只读取整个数据集:
hid_t dataset = ...; // open the dataset (dataset is valid)
double var[3];
auto rc = H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &var[0]);
// rc = -1
上述测试的错误文本:
HDF5-DIAG: Error detected in HDF5 (1.10.5) thread 17272:
#000: \hdf5-1.10.5\src\H5Dio.c line 199 in H5Dread(): can't read data
major: Dataset
minor: Read failed
#001: \hdf5-1.10.5\src\H5Dio.c line 467 in H5D__read(): unable to set up type info
major: Dataset
minor: Unable to initialize object
#002: \hdf5-1.10.5\src\H5Dio.c line 983 in H5D__typeinfo_init(): unable to convert between src and dest datatype
major: Dataset
minor: Feature is unsupported
#003: \hdf5-1.10.5\src\H5T.c line 4546 in H5T_path_find(): can't find datatype conversion path
major: Datatype
minor: Can't get value
#004: \hdf5-1.10.5\src\H5T.c line 4762 in H5T__path_find_real(): no appropriate function for conversion path
major: Datatype
minor: Unable to initialize object
如果您未绑定到特定的 HDF5 库,您可能需要检查 HDFql,因为它大大减轻了您对 HDF5 low-level 详细信息的负担。
要读取和显示数据类型为双精度(64 位)的大小为 3 的一维数组数据集(名为 dset
),可以使用 C++ 中的 HDFql 按如下方式完成:
HDFql::execute("SELECT FROM dset");
while(HDFql::cursorNext() == HDFql::Success)
{
cout << *HDFql::cursorGetBigint() << endl;
}
或者,不使用 HDFql 游标,您可以直接使用数据集 dset
的值填充您的变量,如下所示:
double values[3];
HDFql::variableRegister(&values);
HDFql::execute("SELECT FROM dset INTO MEMORY 0");
for(int i = 0; i < 3; i++)
{
cout << values[i] << endl;
}
我发现可以制作一个数组类型是必需的:
hsize_t size = { 3 };
hid_t type = H5Tarray_create(H5T_NATIVE_DOUBLE, 1, &size);
hid_t dataset = H5Dopen(...);
double var[3];
hsize_t memdim[] = { 1 }; // or how many arrays[3]'s to read
hid_t space = H5Screate_simple(1, memdim, nullptr);
auto rc = H5Dread(dataset, type, space, H5S_ALL, H5P_DEFAULT, &var[0]);