4

関数を使用して複数の netCDF 形式のデータ ファイル (WRF モデル出力ファイル) を読み込んでいますxarray.open_mfdataset()QVAPORVariable 、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])
        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そしてその形は

時間、レフ、y、x、およびその形状は (1186、レフ: 36、y: 699、x: 639) です。

Uとを掛けた後QVAPOR; を計算しUQ=U*QVAPORます。の寸法と形状UQ

時間、lev、y、x_2、x、形状は (Times: 1186、lev: 36、y: 699、x_2: 639、x: 639)

したがって、問題は次のとおりです。

寸法を正しく取得できません。の正しい寸法はUQですTimes, lev, y, x。xarray データセットを異なる次元名で乗算する方法を教えてください。U と QVAPOR がそれぞれ 4 次元であるのに、5 次元の UQ 変数を取得する理由がわかりません。

4

1 に答える 1

9

NumPy とは異なり、Xarrayは位置ではなく名前で配列の次元を照合します。

算術演算で異なる名前のディメンションをループし、DataArray オブジェクトのディメンションが [Times, lev, y, x_2] と [Times, lev, y, x] と異なります。

簡単な修正は、名前を変更することですx_2->x最初の配列で、それらを乗算する前に、たとえば. U.rename({'x_2': 'x'}) * QVAPOR.

(座標値が alongと正確に一致しない場合は、それに沿って座標値を整列または再インデックス化する必要がある場合があることに注意してください。何かのようなものでうまくいくはずです。)x_2xU.rename({'x_2': 'x'}).reindex(x=QVAPOR.x, method='nearest', tolerance=123)

于 2018-03-09T06:18:03.540 に答える