【问题标题】:How to multiply Python Xarray Datasets?如何乘以 Python Xarray 数据集?
【发布时间】:2018-08-17 14:28:34
【问题描述】:

我正在使用xarray.open_mfdataset() 函数读取多个 netCDF 格式的数据文件(WRF 模型输出文件)。我正在阅读和取消各种变量,例如变量QVAPORUV 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,它的形状是

Times, lev, y, x_2 其形状为 (1186, lev: 36, y: 699, x_2: 639)

湿度变量的维度 Ex。 QVAPOR,它的形状是

Times, lev, y, x 其形状为 (1186, lev: 36, y: 699, x: 639)

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

Times, lev, y, x_2, x and shape is (Times: 1186, lev: 36, y: 699, x_2: 639, x: 639)

所以问题如下:

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

【问题讨论】:

  • 您很难判断哪里出了问题,因为我们看不到 U 或 QV 的尺寸。我建议用最小、完整和可验证的问题来编辑您的问题:stackoverflow.com/help/mcve
  • @jhamman .. 谢谢你的建议。我已经对问题进行了更改。我试图让问题尽可能简短。

标签: python netcdf python-xarray xarray


【解决方案1】:

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

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

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

(请注意,如果坐标值与x 上的坐标值不完全匹配,您可能还需要对齐或重新索引坐标值沿x。像U.rename({'x_2': 'x'}).reindex(x=QVAPOR.x, method='nearest', tolerance=123) 这样的东西应该可以解决问题.)

【讨论】:

  • 感谢@shoyer 的回复。你的解决方案奏效了。我只需要稍微调整一下变量。我使用以下代码进行乘法运算。 UQ1=flnm.QVAPOR.rename({'x': 'x_2'}) * U 在此之后我重命名了输出。 UQ1.rename({'x_2':'x'}) 所以输出变量的维度现在是:(Times: 1186, lev: 36, y: 699, x: 639)
猜你喜欢
  • 2016-12-14
  • 2017-03-31
  • 2016-06-08
  • 1970-01-01
  • 2022-12-10
  • 2021-06-14
  • 1970-01-01
  • 2021-05-26
  • 2019-06-08
相关资源
最近更新 更多