如何将Python Xarray数据集相乘?

时间:2018-03-09 04:29:49

标签: python netcdf python-xarray xarray

我正在使用xarray.open_mfdataset()函数读取多个netCDF格式的数据文件(WRF模型输出文件)。我正在阅读并破坏各种变量,例如变量QVAPORU& V resp。我使用以下代码来读取netCDF变量并计算结果变量UQ

import xarray as xr

def desta_var(pp,var):
    flnm = xr.open_mfdataset(pp)
    if var=="U":
        U1 = (flnm.variables[var])
        U = 0.5*(U1[:,:,:,0:-1] + U1[:,:,:,1:] )
        del U1
        return U
    elif var=="V":
        V1 = (flnm.variables[var])
        V=0.5*(V1[:,:,0:-1,:] + V1[:,:,1:,:])
        del V1
        return V
    else:
        W1 = (flnm.variables[var])
        W=0.5*(W1[:,0:-1,:,:] + W1[:,1:,:,:])
        del W1
        return W

 U=desta_var('./WRF_3D_2005_*.nc','U')
 V=desta_var('./WRF_3D_2005_*.nc','V')

 flnm=xr.open_mfdataset('./WRF_3D_2005_*.nc')

 QV = flnm.QVAPOR
 UQ = U*QV

使用上述代码获得的变量的维度和形状:

风变量的尺寸Ex。 U及其形状

  

时间,lev,y,x_2和它的形状是(1186,lev:36,y:699,x_2:639)

水分变量的尺寸Ex。 QVAPOR及其形状

  

时间,lev,y,x和它的形状是(1186,lev:36,y:699,x:639)

UQVAPOR相乘后;我计算UQ=U*QVAPORUQ的尺寸和形状是

  

时间,列弗,y,x_2,x和形状是(时间:1186,左:36,y:699,x_2:639,x:639)

所以问题如下:

我无法确保尺寸正确。 UQ的正确尺寸应为Times, lev, y, x。任何人都可以帮助我如何将xarray数据集与不同的维度名称相乘。 我不知道为什么我得到5维UQ变量而U和QVAPOR各4维。

1 个答案:

答案 0 :(得分:3)

与NumPy不同,Xarray通过 name 匹配数组维度,而不是位置。

它在算术中循环使用不同名称的维度,并且您的DataArray对象具有不同的维度:[Times,lev,y,x_2]和[Times,lev,y,x]。

简单的解决方法是重命名x_2 - >在将它们相乘之前,在第一个数组上x,例如。 U.rename({'x_2': 'x'}) * QVAPOR

(请注意,如果x_2上的坐标值与x上的坐标值不完全匹配,您可能还需要对齐或重新索引。{{1}应该做的伎俩。)