利用Python实现纬度加权平均(即NCL中的wgt_areaave)

       当处理全球数据的时候,最常见的分析就是全球、北半球平均了,这时候一定要注意要根据纬度等信息进行加权,求加权平均,要不然结果肯定会不准。

        对于NCL中,有现成的函数实现:wgt_areaave

        但是对于Python中,常规的计算包里面是没有的,或许现在有其他包可以实现,也可以告诉我~。于是基于numpy写了下面的函数:

def AreaWeightMean(data2D, lat, lon):
    '''
    data2D: 要进行区域加权平均的变量  2D: [lat, lon]
    lat: data2D对应的纬度 1D 最好不要包括-90° 和 90°  因为NCL 和 Python 计算 np.cos(90 * rad) 值差的很大 
    lon: data2D对应的经度 1D
    '''
    jlat = lat.shape[0]
    rad = 4.0 * np.arctan(1.0) / 180.0
    re = 6371220.0
    rr = re * rad
    dlon = np.abs(lon[2] - lon[1]) * rr
    dx = dlon * np.cos(lat * rad)
    dy = np.zeros(jlat)
    dy[0] = np.abs(lat[2] - lat[1]) * rr
    dy[1: jlat - 1]  = np.abs(lat[2: jlat]-lat[0: jlat - 2])*rr * 0.5
    dy[jlat - 1] = abs(lat[jlat - 1] - lat[jlat - 2]) * rr
    area = dx * dy
    # dataAreaWeightMean = np.sum(np.dot(area, data2D))/np.sum(area)
    sumtop = 0
    sumbottom = 0
    for id1 in range(data2D.shape[0]):
        for id2 in range(data2D.shape[1]):
            sumtop = sumtop + data2D[id1, id2]*area[id1]
            sumbottom = sumbottom +area[id1]
    dataAreaWeightMean = sumtop/sumbottom
    return dataAreaWeightMean

看一下结果对比吧:

        直接不加权平均(np.mean(data3D, axis = (1,2)))得到的结果:

        加权平均之后的:

 

 

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
以下是使用NCL(NCAR Command Language)读取WRF输出数据指定经纬度范围mdbz数据的示例代码,其使用了wrf_user_getvar函数: ```ncl load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" ; 加载gsn_code.ncl库 begin ; 定义变量 variable wrf_data, mdbz integer i, j, k, n, ret ; 读取WRF输出的nc文件 wrf_data = addfile("wrfout.nc", "r") ; 获取经度、纬度和垂直层数 lon = wrf_data->XLONG(0,:,:) ; 经度 lat = wrf_data->XLAT(0,:,:) ; 纬度 nz = dimsizes(wrf_data->PH) ; 设置经纬度范围 lon_min = -80.0 lon_max = -70.0 lat_min = 20.0 lat_max = 30.0 ; 获取经度、纬度范围对应的网格索引 lon_idx = where(lon.ge.lon_min .and. lon.le.lon_max, True, False) lat_idx = where(lat.ge.lat_min .and. lat.le.lat_max, True, False) ; 获取经度、纬度范围对应的网格大小 nx = dimsizes(lon_idx) ny = dimsizes(lat_idx) ; 设置起始位置和大小 start = (/0, min(lat_idx), min(lon_idx)/) count = (/1, ny, nx/) ; 获取指定经纬度范围内的mdbz值 mdbz = new((/nz, ny, nx/), typeof(wrf_data->mdbz)) do i = 0, nx-1 start(2) = lon_idx(i) do j = 0, ny-1 start(1) = lat_idx(j) ret = wrf_user_getvar("mdbz", mdbz(:,j,i), start, count, wrf_data) if (ret.ne.0) then ; 错误处理 end if end do end do ; 输出mdbz值 n = nx * ny mdbz = reshape(mdbz, (/nz, n/)) mdbz = transpose(mdbz) mdbz = mdbz(:,0) print(mdbz) ; 释放资源 delete(wrf_data) end ``` 在示例代码,假设WRF输出的nc文件名为“wrfout.nc”。首先,通过addfile函数读取nc文件数据。然后,根据指定的经纬度范围,获取对应的网格索引和网格大小。接着,使用wrf_user_getvar函数获取指定经纬度范围内的mdbz值,并输出。最后,通过delete函数释放资源。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值