Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中重新填充Netcdf文件_Python_Interpolation_Netcdf_Python Xarray_Netcdf4 - Fatal编程技术网

在python中重新填充Netcdf文件

在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使用了一种称为“延迟加载”的方法来尝试避免使用太多内存。在代码中的某个地方,您正在使用一个命令,该命令将全部数据加载到内存中,但它不能这样做。相

我正在尝试将NetCDF文件从0.125度空间比例重新划分为0.083度空间比例。netcdf包含224个纬度和464个经度,它有一年的每日数据

我尝试了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:二阶保守重映射
您可以使用网格描述符文件来定义需要插值到的区域

在grid.txt文件中

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