首页 > 解决方案 > Python:如何加载 MATLAB 字符串并将它们串联保存为 netCDF 文件中的变量?

问题描述

我想从 MATLAB 结构文件中加载 2 个字符串数组,将它们压缩/连接在一起,然后保存到 netCDF 文件中。

我有以下数据 MATLAB 结构文件:

data.string1 = ['a','b','c']

data.string2 = ['d','e','f']

在 Python 中,我想将它们连接/压缩成 2x3 矩阵,并将它们保存为 netCDF 文件“file.nc”中的变量“文本”,尺寸为“dim1”= 2,“dim2”= 3。

这是我到目前为止所拥有的:

data f = h5py.File('data.mat','r') 

data = {"string1":np.str(f.get('string1')), "string2":np.array(f.get('string2'))}

dataset = Dataset('file.nc', 'w',  format='NETCDF4_CLASSIC') 

dim1 = dataset.createDimension('dim1', 2)
dim2 = dataset.createDimension('dim2', 3)

我的问题是字符串 1 和 2 在加载到 Python 时被归类为以下内容,我不知道如何继续:

HDF5 数据集“time_bounds_1”:形状 (1, 6),类型“

如何继续连接字符串 1 和 2,并将“文本”保存为 netCDF 文件中尺寸为 dim1 和 dim2 的变量?

我还有以下代码,以后可以修改以提供帮助:

text = dataset.createVariable('text', np.str, ('dim1','dim2')) # this does not work - error with np.str! 
text[:,:] = np.asmatrix(text) # not sure this will work with strings

标签: python-3.xstringmatlabnetcdf4

解决方案


好的,所以我决定在 python 中创建时间列表,然后将它们保存为 netCDF 中的浮点数而不是字符串。这不是我最初想要的,但我已经解决了这个问题。

对于那些可能感兴趣的人,这里是代码(与我上面的简单示例不同的维度和变量):

import numpy as np
from netCDF4 import Dataset,num2date,date2num
import datetime
# ----------------------
nv = 2
time=365
# ---------------------------------------------------
base = datetime.datetime(1950,1,1,00,00,1)
numdays = 365
timevalue1 = [base + datetime.timedelta(days=x) for x in range(numdays)]
base = datetime.datetime(1950,1,1,23,59,59)
timevalue2 = [base + datetime.timedelta(days=x) for x in range(numdays)]
#timevalue = datetime.datetime(2014,4,11,23,59)
time_unit_out= "days since 1950-01-01 00:00:00 UTC"
# ---------------------------------------------------
nc_out = Dataset('test.nc', 'w', format='NETCDF4')
time = nc_out.createDimension('time',time)
nv = nc_out.createDimension('nv',nv)
times = nc_out.createVariable('time', np.float64, ('time','nv'))
times.setncattr('unit',time_unit_out);

times[:,0] = date2num(timevalue,time_unit_out);
times[:,1] = date2num(timevalue2,time_unit_out);

nc_out.close()

推荐阅读