Я уверен, что вы могли бы найти / найти более элегантное решение, но я просто скомбинировал Python
и исполняемый файл оболочки cdo
для выполнения задачи (вызов подпроцесса иногда может рассматриваться как дурная привычка где-то).
#!/usr/bin/env ipython
import numpy as np
from netCDF4 import Dataset
import subprocess
# -------------------------------------------------
def nc_varget(filein,varname):
ncin=Dataset(filein);
vardata=ncin.variables[varname][:];
ncin.close()
return vardata
# -------------------------------------------------
gridfile='extract_feature.nc'
inputfile='precipitation_2000-2015_annual_SA.nc'
outputfile='selected_region.nc'
# -------------------------------------------------
# Detect the start/end based on gridfile:
poutlon=nc_varget(gridfile,'lon')
poutlat=nc_varget(gridfile,'lat')
pinlon=nc_varget(inputfile,'lon')
pinlat=nc_varget(inputfile,'lat')
kkx=np.where((pinlon>=np.min(poutlon)) & (pinlon<=np.max(poutlon)))
kky=np.where((pinlat>=np.min(poutlat)) & (pinlat<=np.max(poutlat)))
# -------------------------------------------------
# -------------------------------------------------
commandstr='cdo selindexbox,'+str(np.min(kkx))+','+str(np.max(kkx))+','+str(np.min(kky))+','+str(np.max(kky))+' '+inputfile+' '+outputfile
subprocess.call(commandstr,shell=True)
Проблема в ваших данных заключается в том, что файл "depositation_2000-2015_annual_SA.nc" на данный момент не указывает сетку - переменные lon, lat являются общими, и, следовательно, сетка является общей. В противном случае вы можете использовать другие операторы вместо selindexbox
. Файл extract_feature.nc
ближе к стандарту, поскольку переменные lon, lat имеют также атрибуты name и unit.