1

我正在编写代码,但问题很大,计算时间太长。

简而言之,这个EDI的定义(Byun and wilhite 1999) EDI是累积加权降水指数

pr = 降水,累积天数:重新定义累积天数后的 365 天(1 年)。

大问题是重新定义的代码..

我的代码如下 主要代码:return_redifine_EP_MEP_DS

子代码:return_EP_v2、return_MEP_v2、return_DEP_v2

附加说明

  1. 我正在使用 python iris 和 numpy 等,

  2. EP_cube.data 或 MEP_cube.data 。“.data”是数组

  3. 数据集。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
4

0 回答 0