1

我们在 HDF5 中获得了一些文件,其中包含数据集、表格数据,其中每一列都被命名并且可能是不同的数据类型(例如字符串类型的“作者”、无符号整数类型的“计数”等)我能找到的用于阅读 HDF5 的唯一纯 Java(即非 JNI)库是 NetCDF。

看来我可以使用 NetCDF 从 HDF5 数据集中读取单列数据Variable。但是有没有办法从数据集中读取整个数据表?NetCDF 的 HDF5 数据集是否仅仅是具有单维数组值的变量集合而不是表?

编辑:让我进一步解释。如果我在 HDFView 2.9 中打开一个 HDF5 文件,导航到“HDF5 复合数据集”项,然后选择“打开”,就会出现一个漂亮的小表格,其中“变量”显示为列标题,每一行都是由索引标记。例如,假设有一个整数 32 符号类型的“Foo”列和一个字符串类型的“Bar”列。

但是用于从这个“复合数据集”加载数据的 NetCDF API 似乎根本不像表格数据。我可以要求加载名为“Foo”的整个“变量”数组,并且“变量”似乎独立于“Bar”变量。这是否意味着“Foo”和“Bar”变量可以是不同长度的数组?

在表格中,我希望能够逐行访问事物。我可以说“给我一个包含第 5 行所有值的数组吗?” 好的,所以原始值和装箱等存在问题,但我可以要求返回整行的底层字节吗?我可以说“给我'Foo'列中第5行的值作为整数”吗?也许你说我真正想要请求的是“Foo”数组中的元素 5。所以我回到我原来的问题:问题 1.数据集的 NetCDF API 是否仅访问一组完全不相关的变量(可能具有单独的数组长度等),或者是否有一些 API 允许访问这个数据作为一个真实的表?

如果您仍然不了解表格视图和变量列表之间的区别,请考虑以下相关问题:问题 2.如何找到数据集表中的行数?我是否被迫迭代数据集中的所有变量并找到每个数组长度的最大值?

由于我正在查找变量的数组长度,这又带来了另一个问题:问题 3。如何在不读取整个数组的情况下找到数据集中变量的长度?如果我使用netCDFFile.findVariable("/some/path/dataset.variable").getSize(),这只是返回值1。直到我真正读取了整个数组(可能是很多兆字节!)netCDFVariable.read().getSize(),我才得到正确的长度!没有更有效的方法吗?

答案:答案原来是对John Caron 答案的详细阐述。由于某种原因,每个变量(列)都认为它是可变长度的,即使它的父结构(数据集/表)是固定长度的。要以更表格的方式处理一组变量,请获取对父级Structure(本身 a Variable)的引用,并询问其大小。该Structure.getSize()值将正确指示每个变量的长度——即使每个变量Variable.getSize()都会返回1

4

2 回答 2

1

问题 1. 用于数据集的 NetCDF API 是否仅访问一组完全不相关的变量(可能具有单独的数组长度等),还是有一些 API 允许将这些数据作为真实表访问?

NetCDF-Java 是一个低级库,其他应用程序在其上构建特定接口。HDFView 就是这样一个应用程序,尽管它不是基于 NetCDF-Java 构建的。你可以看看 Unidata 的 ToolsUI,它有一些检查结构数据的功能,虽然没有文档。

问题 2. 如何查找数据集表中的行数?我是否被迫迭代数据集中的所有变量并找到每个数组长度的最大值?

结构可能看起来像

Structure {
  float fld1;
  int fld2;
  ...
} sname (200);

所以它是一个结构数据数组(在本例中为一维)(在 HDF5 中也称为复合)。所以行数是

Varible snameV = ncfile.findVariable("sname");
long nrows = snameV.getSize();

问题3.如何在不读取整个数组的情况下找到数据集中变量的长度?如果我使用 netCDFFile.findVariable("/some/path/dataset.variable").getSize(),这只会返回值 1。直到我使用 netCDFVariable.read( ).getSize()

如果它是一个可变长度数组,那么你有:

Structure {
  float fld1;
  int fld2;
  ...
} sname (*);

其中“*”表示“可变长度维度”。那么没有阅读就没有办法找出长度。我认为它是 HDF5 格式的“功能”。

于 2013-05-01T14:21:08.953 回答
0

NetCDF-Java 将使您能够访问 HDF5 文件中的所有数据。如果不是,它是一个错误,我们将修复。

是的,HDF5 中的数据集 == netCDF 中的变量。

如果数据集在 HDF5 中是“复合”类型,那么它将是 netCDF-Java 中的“结构”。

除非我能得到实际的文件,否则不能更具体。

约翰

于 2013-04-22T15:36:53.277 回答