Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何增加Python Xarray数据集?_Python_Netcdf_Python Xarray_Xarray - Fatal编程技术网

如何增加Python Xarray数据集?

如何增加Python Xarray数据集?,python,netcdf,python-xarray,xarray,Python,Netcdf,Python Xarray,Xarray,我正在使用xarray.open_mfdataset()函数读取多个netCDF格式的数据文件(WRF模型输出文件)。我正在读取并消除各种变量的聚集,例如变量QVAPOR,U,Vresp。我使用以下代码读取netCDF变量并计算结果变量UQ import xarray as xr def desta_var(pp,var): flnm = xr.open_mfdataset(pp) if var=="U": U1 = (flnm.variables[var])

我正在使用
xarray.open_mfdataset()
函数读取多个netCDF格式的数据文件(WRF模型输出文件)。我正在读取并消除各种变量的聚集,例如变量
QVAPOR
U
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
使用上述代码获得的变量的尺寸和形状:

风变量的尺寸,例如
U
,其形状为

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

湿度变量的尺寸,例如QVAPOR,其形状为

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

U
QVAPOR
相乘后;我计算
UQ=U*QVAPOR
UQ
的尺寸和形状为

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

因此,问题如下:

我无法得到正确的尺寸。
UQ
的正确尺寸应为
倍,lev,y,x
。谁能帮我把xarray数据集与不同的维度名称相乘。
我不知道为什么我得到的UQ变量是5维的,而U和QVAPOR分别是4维的。

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

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

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


(请注意,如果坐标值与沿
x
的坐标值不完全匹配,可能还需要沿
x
对齐或重新编制坐标值索引。类似
U.rename({'x\U 2':'x'})。重新编制索引(x=QVAPOR.x,method='nearest',tolerance=123)
应该可以做到这一点。)

很难判断您的问题出在哪里,因为我们看不到U或QV的尺寸。我建议用一个最小的、完整的、可验证的问题来编辑你的问题:@jhamman。。谢谢你的建议。我对问题做了修改。我尽量把问题简短。谢谢你的回复@shoyer。你的解决方案奏效了。我只需要用变量稍微调整一下。我使用了下面的乘法代码
UQ1=flnm.QVAPOR.rename({'x':'x_2'})*U
在此之后,我重命名了输出
UQ1.重命名({'x_2':'x'})
因此输出变量的维度现在是:
(Times:1186,lev:36,y:699,x:639)