在python中重新填充Netcdf文件
我正在尝试将NetCDF文件从0.125度空间比例重新划分为0.083度空间比例。netcdf包含224个纬度和464个经度,它有一年的每日数据 我尝试了xarray,但它产生了以下内存错误:在python中重新填充Netcdf文件,python,interpolation,netcdf,python-xarray,netcdf4,Python,Interpolation,Netcdf,Python Xarray,Netcdf4,我正在尝试将NetCDF文件从0.125度空间比例重新划分为0.083度空间比例。netcdf包含224个纬度和464个经度,它有一年的每日数据 我尝试了xarray,但它产生了以下内存错误: MemoryError:无法分配103。具有形状(13858233841,)和数据类型float64的数组的GiB 如何使用python重新填充文件?Xarray使用了一种称为“延迟加载”的方法来尝试避免使用太多内存。在代码中的某个地方,您正在使用一个命令,该命令将全部数据加载到内存中,但它不能这样做。相
MemoryError:无法分配103。具有形状(13858233841,)和数据类型float64的数组的GiB
如何使用python重新填充文件?Xarray使用了一种称为“延迟加载”的方法来尝试避免使用太多内存。在代码中的某个地方,您正在使用一个命令,该命令将全部数据加载到内存中,但它不能这样做。相反,您应该指定计算,然后将结果直接保存到文件中。Xarray将一次执行一个块的计算,而不会将所有内容加载到内存中 重新投标的示例可能如下所示:
da_input = open_dataarray(
'input.nc') # the file the data will be loaded from
regrid_axis = np.arange(-90, 90, 0.125) # new coordinates
da_output = da_input.interp(lat=regrid_axis) # specify calculation
da_ouput.to_netcdf('output.nc') # save direct to file
例如,执行
da\u input.load()
,或da\u output.compute()
,将导致所有数据加载到内存中—这是您希望避免的。最简单的方法是使用CDO、NCO和NCL等运算符
前
目标gid可以是描述符文件,也可以使用具有所需网格分辨率的NetCDF文件。注意其他可能适合您需要的重新投标方法。上面的示例使用双线性插值。另一个选项是try,它(通常)可以在球面极坐标和笛卡尔坐标中重新生成大于内存的数据集。它使用ESMF重新填充引擎来完成此操作,因此可以使用线性、一阶和二阶保守、最近邻等重新填充方法
下面是一个您需要的重新投标类型的示例:
import cf
import numpy
f = cf.example_field(2) # Use cf.read to read your own data
print('Source field:')
print(f)
# Define the output grid
lat = cf.DimensionCoordinate(
data=cf.Data(numpy.arange(-90, 90.01, 0.083), 'degreesN'))
lon = cf.DimensionCoordinate(
data=cf.Data(numpy.arange(0, 360, 0.083), 'degreesE'))
# Regrid the field
g = f.regrids({'latitude': lat, 'longitude': lon}, method='linear')
print('\nRegridded field:')
print(g)
产生:
Source field:
Field: air_potential_temperature (ncvar%air_potential_temperature)
------------------------------------------------------------------
Data : air_potential_temperature(time(36), latitude(5), longitude(8)) K
Cell methods : area: mean
Dimension coords: time(36) = [1959-12-16 12:00:00, ..., 1962-11-16 00:00:00]
: latitude(5) = [-75.0, ..., 75.0] degrees_north
: longitude(8) = [22.5, ..., 337.5] degrees_east
: air_pressure(1) = [850.0] hPa
Regridded field:
Field: air_potential_temperature (ncvar%air_potential_temperature)
------------------------------------------------------------------
Data : air_potential_temperature(time(36), latitude(2169), longitude(4338)) K
Cell methods : area: mean
Dimension coords: time(36) = [1959-12-16 12:00:00, ..., 1962-11-16 00:00:00]
: latitude(2169) = [-90.0, ..., 89.94399999999655] degreesN
: longitude(4338) = [0.0, ..., 359.971] degreesE
: air_pressure(1) = [850.0] hPa
有很多选项可以从其他字段获取目标网格,也可以显式定义目标网格。更多细节可以找到
cf python将根据附加到数据集的cf元数据推断出哪些轴是X轴和Y轴等,但如果缺少这些轴,则总是有办法手动设置或解决这些轴。使用CDO作为后端的python选项是我的包nctoolkit:,可通过pip() 它有一个名为_latlon的内置方法,该方法将重新生成指定的latlon网格 在您的情况下,您需要执行以下操作: 将nctoolkit导入为nc 数据=常开数据(填充) 数据。到latlon(lon=[lon\U min,lon\U max],lat=[lat\U min,lat\U max],res= [0.083,0.083])
为了补充CDO的答案,有几种内置的重新投标方法:
- remapbic:双三次插值
- remapbil:双线性插值
- remapnn:最近邻插值
- remapcon:一阶保守重映射
- remapcon2:二阶保守重映射
gridtype=lonlat
xfirst=X (here X is the longitude of the left hand point)
xinc=0.083
xsize=NX (here put the number of points in domain)
yfirst=Y
yinc=0.083
ysize=NY
然后
cdo remapbil,grid.txt in.nc out.nc
有关更多详细信息,请参阅我的。能否提供一个完整的示例,说明您尝试过但无法使用的代码?
cdo remapbil,grid.txt in.nc out.nc