xarray DataArray.where () уменьшил координату при маскировании - PullRequest
0 голосов
/ 09 сентября 2018

новичок xarray здесь. Очень простой случай, у меня есть массив типов осадков (ntim x nlat x nlon) и общий массив осадков (те же размеры). Оба находятся в отдельных файлах netCDF. Я хочу замаскировать массив осадков, где A) выпадает количество осадков (> 1e-8 м / с) и B) тип осадков - снег (maskvar = 0.0). Выходной массив, следовательно, "где идет снег?" массив.

При использовании xarray where () с несколькими условиями из двух разных (но одинакового размера) массивов в результирующем замаскированном массиве сохраняются только две широты (северный и южный полюс).

Однако, если я использую предварительно замаскированный массив (из NCL, записанный как netCDF с теми же значениями) в качестве теста, он ведет себя как ожидалось (т. Е. Возвращает ntim x nlat x nlon) массив.

Единственное очевидное, что бросается в глаза, это то, что координаты lat не одинаково типизированы между двумя массивами, хотя неясно, почему это может привести к сбою таким образом.

Любая помощь приветствуется.

Пример кода:

ensnum='001'
indir  = '/glade/u/home/zarzycki/scratch/LENS-snow/'
files  = [indir+'/b.e11.B20TRC5CNBDRD.f09_g16.'+ensnum+'.cam.h2.PTYPE.1990010100Z-2005123118Z.nc']
indir2 = '/glade/p_old/cesmLE/CESM-CAM5-BGC-LE/atm/proc/tseries/hourly6/PRECT/'
files2 = [indir2+'/b.e11.B20TRC5CNBDRD.f09_g16.'+ensnum+'.cam.h2.PRECT.1990010100Z-2005123118Z.nc']
indir3 = indir
files3 = [indir3+'/b.e11.B20TRC5CNBDRD.f09_g16.'+ensnum+'.cam.h2.PRECT_SNOW.1990010100Z-2005123118Z.nc']

for idx, val in enumerate(files):
  ds  = xr.open_dataset(files[idx])
  ds2 = xr.open_dataset(files2[idx])
  ds3 = xr.open_dataset(files3[idx])

  ptype  = ds.PTYPE[1:11,:,:]         # 10 time x 192 lat x 288 lon
  prect1 = ds2.PRECT[1:11,:,:]        # 10 time x 192 lat x 288 lon
  prect2 = ds3.PRECT_SNOW[1:11,:,:]   # 10 time x 192 lat x 288 lon
  print('---------')
  print(ptype)
  print(prect1)
  print(prect2)

  ptype1 = ptype.where((ptype > -0.1) & (ptype < 0.1) & (prect1 > 1e-8))
  ptype2 = ptype.where((ptype > -0.1) & (ptype < 0.1) & (prect2 > 1e-8))
  print('---------')
  print(ptype1)
  print(ptype2)

Пример вывода, показывающий, что все прочитанные переменные имеют значение (время: 10, широта: 192, долгота: 288), но возвращаются маскированные переменные (время: 10, широта: 2, долгота: 288) и (время: 10, широта: 192, долг .: 288)

---------
<xarray.DataArray 'PTYPE' (time: 10, lat: 192, lon: 288)>
[552960 values with dtype=float32]
Coordinates:
  * lat      (lat) float32 -90.0 -89.0576 -88.1152 -87.1728 -86.2304 -85.288 ...
  * lon      (lon) float32 0.0 1.25 2.5 3.75 5.0 6.25 7.5 8.75 10.0 11.25 ...
  * time     (time) datetime64[ns] 1990-01-01T12:00:00 1990-01-01T18:00:00 ...
<xarray.DataArray 'PRECT' (time: 10, lat: 192, lon: 288)>
[552960 values with dtype=float32]
Coordinates:
  * lat      (lat) float64 -90.0 -89.06 -88.12 -87.17 -86.23 -85.29 -84.35 ...
  * lon      (lon) float64 0.0 1.25 2.5 3.75 5.0 6.25 7.5 8.75 10.0 11.25 ...
  * time     (time) datetime64[ns] 1990-01-01T12:00:00 1990-01-01T18:00:00 ...
Attributes:
    units:         m/s
    long_name:     Total (convective and large-scale) precipitation rate (liq...
    cell_methods:  time: mean
<xarray.DataArray 'PRECT_SNOW' (time: 10, lat: 192, lon: 288)>
[552960 values with dtype=float32]
Coordinates:
  * lat      (lat) float32 -90.0 -89.0576 -88.1152 -87.1728 -86.2304 -85.288 ...
  * lon      (lon) float32 0.0 1.25 2.5 3.75 5.0 6.25 7.5 8.75 10.0 11.25 ...
  * time     (time) datetime64[ns] 1990-01-01T12:00:00 1990-01-01T18:00:00 ...
Attributes:
    units:    m/s
---------
<xarray.DataArray (time: 10, lat: 2, lon: 288)>
array([[[ nan,  nan, ...,  nan,  nan],
        [ nan,  nan, ...,  nan,  nan]],

       [[ nan,  nan, ...,  nan,  nan],
        [ nan,  nan, ...,  nan,  nan]],

       ..., 
       [[ nan,  nan, ...,  nan,  nan],
        [ nan,  nan, ...,  nan,  nan]],

       [[ nan,  nan, ...,  nan,  nan],
        [ nan,  nan, ...,  nan,  nan]]], dtype=float32)
Coordinates:
  * lat      (lat) float64 -90.0 90.0
  * lon      (lon) float32 0.0 1.25 2.5 3.75 5.0 6.25 7.5 8.75 10.0 11.25 ...
  * time     (time) datetime64[ns] 1990-01-01T12:00:00 1990-01-01T18:00:00 ...
<xarray.DataArray (time: 10, lat: 192, lon: 288)>
array([[[ nan,  nan, ...,  nan,  nan],
        [ nan,  nan, ...,  nan,  nan],
        ..., 
        [ nan,  nan, ...,  nan,  nan],
        [ nan,  nan, ...,  nan,  nan]],

       [[ nan,  nan, ...,  nan,  nan],
        [ nan,  nan, ...,  nan,  nan],
        ..., 
        [ nan,  nan, ...,  nan,  nan],
        [ nan,  nan, ...,  nan,  nan]],

       ..., 
       [[ nan,  nan, ...,  nan,  nan],
        [ nan,  nan, ...,  nan,  nan],
        ..., 
        [ nan,  nan, ...,  nan,  nan],
        [ nan,  nan, ...,  nan,  nan]],

       [[ nan,  nan, ...,  nan,  nan],
        [ nan,  nan, ...,  nan,  nan],
        ..., 
        [ nan,  nan, ...,  nan,  nan],
        [ nan,  nan, ...,  nan,  nan]]], dtype=float32)
Coordinates:
  * lat      (lat) float32 -90.0 -89.0576 -88.1152 -87.1728 -86.2304 -85.288 ...
  * lon      (lon) float32 0.0 1.25 2.5 3.75 5.0 6.25 7.5 8.75 10.0 11.25 ...
  * time     (time) datetime64[ns] 1990-01-01T12:00:00 1990-01-01T18:00:00 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...