как сделать цикл по временным сериям NetCDF - PullRequest
0 голосов
/ 05 июня 2019

У меня есть данные временных рядов NetCDF.При чтении переменных я хочу составить список для глобального среднего значения для каждого из данных.Я написал код, который работает, но это не сексуально.Как я могу написать (зациклить) этот код в лучшем виде?

variables = 'name1 name2 name3 name4'.split()
name1  =[]
name2  =[]
name3  =[]
name4  =[]

for i in range (9,40):
    name1_irrY = name1_aSrc[i].mean()
    name1.append(name1_irrY)
    name2_irrY = name2_aSrc[i].mean()
    name2.append(name2_irrY)
    name3_irrY = name3_aSrc[i].mean()
    name3.append(name3_irrY)
    name4_irrY = name4_aSrc[i].mean()
    sname4.append(name4_irrY)

"name"_aSrc[i,:,:] можно использовать в NetCDF.

так как у меня много файлов, мне нужно достаточно пути.

1 Ответ

2 голосов
/ 05 июня 2019

Я не думаю, что вам нужен цикл вообще, так как вы можете указать, по какой оси вы хотите вычислить среднее значение. Так что-то вроде этого должно быть достаточно (это заменяет весь блок кода, который вы опубликовали):

name1 = np.mean(name1_aSrc[9:40,:,:], axis=(1,2))
name2 = np.mean(name2_aSrc[9:40,:,:], axis=(1,2))
# etc..

Небольшой пример с некоторыми данными NetCDF, которые у меня были:

import xarray as xr
import numpy as np

f = xr.open_dataset('u.xz.nc', decode_times=False)
u = f['u'].values

print(u.shape)  # prints: (5, 96, 128, 1)

umean = np.mean(u, axis=(1,2,3))

print(umean.shape) # prints: (5,)

Альтернативное решение состоит в том, чтобы позволить xarray вычислить среднее значение для (именованного) измерения или нескольких измерений. Быстрый пример с некоторыми другими данными:

import xarray as xr
import numpy as np

f = xr.open_dataset('drycblles_default_0000000.nc', decode_times=False)

# Original file has 3 dimensions:
print(f.dims)   # prints Frozen(SortedKeysDict({'time': 37, 'z': 32, 'zh': 33}))

# Calculate mean over one single dimension:
fm1 = f.mean(dim='z')
print(fm1.dims)  # prints Frozen(SortedKeysDict(OrderedDict([('time', 37), ('zh', 33)])))

# Calculate mean over multiple dimensions:
fm2 = f.mean(dim=['z','zh'])
print(fm2.dims)  # prints Frozen(SortedKeysDict(OrderedDict([('time', 37)])))

fm1 и fm2 снова просто наборы данных xarray:

<xarray.Dataset>
Dimensions:  (time: 37)
Coordinates:
  * time     (time) float64 0.0 300.0 600.0 900.0 ... 1.02e+04 1.05e+04 1.08e+04
Data variables:
    iter     (time) float64 0.0 5.0 10.0 15.0 20.0 ... 282.0 293.0 305.0 317.0
    area     (time) float64 1.0 1.0 1.0 1.0 1.0 1.0 ... 1.0 1.0 1.0 1.0 1.0 1.0
    areah    (time) float64 1.0 1.0 1.0 1.0 1.0 1.0 ... 1.0 1.0 1.0 1.0 1.0 1.0
    th       (time) float64 304.8 304.8 304.8 304.8 ... 305.1 305.1 305.1 305.1
    th_3     (time) float64 1.246e-08 -3.435e-11 ... 7.017e-06 5.548e-05    
...