python读取hdf5文件并转为nc/matlab查看hdf5信息并输出——以北极AMSR2海冰密集度数据为例(h5py、hdf5disp)

什么是HDF5?它的特点?

HDF 是由美国国家超级计算应用中心(NCSA)创建的,以满足不同群体的科学家在不同工程项目领域之需要所建立一种文件格式。主要用来存储与分发不同科学数据。
在研究过程中,我们往往需要多种数据,而数据与数据间有着不同的特性、来源、信息,将不同格式与来源的数据进行存储交换,并给予对应的数据说明,便是HDF格式文件解决的问题。
HDF格式一般有HDF4/HDF5,目前许多卫星遥感数据便以HDF5的格式储存。

HDF5的结构

有人将HDF文件称作“数据之书”,这是个很贴切的比喻,HDF5的格式正像书一样,有着目录(group)、章节(Dataset)、段落(Attributes)。
一个HDF5文件有两个Object:group与Dataset。
GROUP类似于一个书的章节目录,不同GROUP包含着不同Dataset,而同时,不同的Data又有不同的数据说明,这就是属性(Attributes)。

''' h5py_example.hdf5 file structure
	+-- '/'
	|   +--	group "bar1"
	|   |   +-- group "car1"
	|   |   |   +-- None
	|   |   |   
	|   |   +-- dataset "dset1"
	|   |
	|   +-- group "bar2"
	|   |   +-- group "car2"
	|   |   |   +-- None
	|   |   |
	|   |   +-- dataset "dset2"
	|   |   
	|   +-- dataset "dset"
	|   |   +-- attribute "myAttr1"
	|   |   +-- attribute "myAttr2"
	|   |   
	|   
	'''

h5py读取HDF5

下面给出一些h5py读取HDF5的基本语句:

import h5py
filepath='F:/AMSR/spring/'
h5list=glob.glob(filepath+'/*.he5')
f1 = h5py.File(h5list[1],mode = 'r')
#获取所有变量列表
all_vars = list(f1.keys())

其中,all_vars里会给出所有的GROUP名称。keys可以返回所有主键,即名称,使用items则可以查看groups下的目录:

print(list(hdf.items()))
返回:
[('ADDITIONAL', <HDF5 group "/HDFEOS/ADDITIONAL" (1 members)>), ('GRIDS', <HDF5 group "/HDFEOS/GRIDS" (2 members)>)]

通过这样逐层查看hdf5文件的信息,我们就可以找到需要的Dataset目录,并将其提取。

查看hdf5信息并保存

上面的方法固然可以查看信息,但是,当hdf5文件内容复杂时,这样的逐层查看十分耗时,
在python中我没有找到可以一口气显示hdf5信息的方法,于是我先用了matlab里的h5disp函数获取信息,并输出:

diary('h5info.txt');
diary on;
h5disp('AMSR_U2_L3_SeaIce25km_B04_20180902.he5');
diary off;

输出:
在这里插入图片描述

读取hdf5数据并转为nc

通过将HDF5数据信息打印,我们可以比较快速的找到对应数据的目录并读取:

lat=np.array(f1['/HDFEOS/GRIDS/NpPolarGrid25km/lat'])
lon=np.array(f1['/HDFEOS/GRIDS/NpPolarGrid25km/lon'])
sic=np.array(f1['/HDFEOS/GRIDS/NpPolarGrid25km/Data Fields/SI_25km_NH_ICECON_DAY'])

转为nc文件:

f=nc.Dataset('F:/AMSR/sic.nc','w',format = 'NETCDF4')
f.createDimension('lat',384 )
f.createDimension('lon', 448)

f.createVariable('sic', np.int32,('lon','lat'))
f.variables['sic'][:]=sic
f.close()

完成

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,您的问题是如何使用C++的hdf5读取Pythonh5py创建的mat文件。 首先,您需要确保Pythonh5py库已经安装并可以正常运行。然后,您可以使用以下代码将数据保存到mat文件中: ``` import h5py # 创建一个h5文件文件指针是f f = h5py.File('data.mat', 'w') # 将数据写入h5文件 data = [1, 2, 3, 4, 5] f.create_dataset('data', data=data) # 关闭文件 f.close() ``` 这将创建一个名为"data.mat"的文件,并将数据存储在名为"data"的数据集中。 接下来,您可以使用C++的hdf5库来读取这个mat文件。以下是一个简单的示例代码: ``` #include <iostream> #include "hdf5.h" int main() { // 打开mat文件 hid_t file_id = H5Fopen("data.mat", H5F_ACC_RDONLY, H5P_DEFAULT); // 打开数据集 hid_t dataset_id = H5Dopen2(file_id, "/data", H5P_DEFAULT); // 获取数据集的数据类型和数据空间 hid_t datatype_id = H5Dget_type(dataset_id); hid_t dataspace_id = H5Dget_space(dataset_id); // 获取数据集的维度 hsize_t dims[1]; H5Sget_simple_extent_dims(dataspace_id, dims, NULL); // 读取数据集的数据 int* data = new int[dims[0]]; H5Dread(dataset_id, datatype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); // 输出数据 for (int i = 0; i < dims[0]; i++) { std::cout << data[i] << std::endl; } // 释放资源 delete[] data; H5Tclose(datatype_id); H5Sclose(dataspace_id); H5Dclose(dataset_id); H5Fclose(file_id); return 0; } ``` 这将打开"data.mat"文件,并读取名为"data"的数据集中的数据,然后输出它们。 希望这可以帮助您解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值