我正在编写代码,但问题很大,计算时间太长。
简而言之,这个EDI的定义(Byun and wilhite 1999) EDI是累积加权降水指数
pr = 降水,累积天数:重新定义累积天数后的 365 天(1 年)。
大问题是重新定义的代码..
我的代码如下 主要代码:return_redifine_EP_MEP_DS
子代码:return_EP_v2、return_MEP_v2、return_DEP_v2
附加说明
我正在使用 python iris 和 numpy 等,
EP_cube.data 或 MEP_cube.data 。“.data”是数组
数据集。CMIP5 模型降水(时间、纬度、经度)
origin_pr 为降水和形状(时间、纬度、经度):1971~2000
EP_cube是累积降水和(时间,纬度,经度):1972~2000
MEP_cube 是 EP_cube(时间、纬度、经度)的爬升平均值(每个日历日):365 天
DEP_cube 是 EP_cube 减去 clim mean EP_cube(MEP) ,(时间、纬度、经度):1972~2000
sy,ey 是气候学年
day 是每个型号的 1years 天(例如:HadGEM2-AO 是 360 天,ACCESS1-0:365 天)
def return_redifine_EP_MEP_DS(origin_pr,EP_cube,DEP_cube,sy,ey,day):
origin_DS = day
origin_day= day
DS_cube = EP_cube - EP_cube.data + day
DS = origin_DS
o_DEP_cube =DEP_cube.copy()
return_time = 0
for j in range(0,DEP_cube.data.shape[1]):
for k in range(0,DEP_cube.data.shape[2]):
for i in range(1,DEP_cube.data.shape[0]):
if DEP_cube.data[i,j,k] <0 and DEP_cube.data[i-1,j,k] < 0:
DS = DS + 1
else:
DS = origin_DS
if DS != origin_DS:
EP_cube.data[i,j,k] = return_EP_v2(origin_pr[i-DS+origin_day:i+origin_day,j,k], DS)
day_of_year = DEP_cube[i,j,k].coord('day_of_year').points
MEP_cube.data[day_of_year-1,j,k] = return_MEP_v2(EP_cube[:,j,k], sy, ey,day_of_year)
DEP_cube.data[i,j,k] = return_DEP_v2(EP_cube[i,j,k], MEP_cube[day_of_year-1,j,k])
return EP_cube, MEP_cube, DEP_cube, DS_cube
和下面的子代码
def return_EP_v2(origin_pr,DS):
weights = np.arange(DS,0,-1) ## 1/1, 1/2, 1/3 ....
EP_data = np.sum(origin_pr.data / weights)
return EP_data
def return_MEP_v2(EP_cube,sy,ey,day_of_year):
### Below mean is extract years and want days(julian day)
ex_EP_cube = EP_cube.extract(iris.Constraint(year = lambda t: sy<=t<=ey, day_of_year = day_of_year ))
### Below mean is clim mean of EP_cube
MEP_data = ex_EP_cube.collapsed('day_of_year',iris.analysis.MEAN).data
return MEP_data
def return_DEP_v2(EP_cube, MEP_cube):
DEP_data = EP_cube.data - MEP_cube.data
return DEP_data