Python: применить функцию к каждой записи в массиве netCDF / numpy 3d - PullRequest
0 голосов
/ 05 марта 2019

Вдохновлен https://stackoverflow.com/a/55001336/7474503 Я пытаюсь применить функцию к моему массиву 3d netCDF / numpy.

from netCDF4 import Dataset 
import numpy as np
my_example_nc_file = '/Users/Severin/Desktop/ecmwf_era5_17010100.nc'
fh = Dataset(my_example_nc_file, mode='r') #fh becomes the file handle of the open netCDF file

lons = fh.variables['lon'][:]
lats = fh.variables['lat'][:]
gph = fh.variables['GPH'][0,:,:,:]

# Function to calculate the Pressure in hPa at point x/y at level z
# p(z,j,i) = a(z) + b(z)*ps(j,i)
# http://cfconventions.org/Data/cf-conventions/cf-conventions-1.0/build/apd.html
# Assumption j,i are lat & lon (in this order)
# lat=y=j & lon=x=i
def calcP(z,x,y,a=a,b=b,ps=ps):
    p = (a[z]+b[z]*ps[x,y])/100
    return p

a = fh.variables['a']
b = fh.variables['b']
ps = fh.variables['ps'][0,:,:]

p3d = np.fromfunction(calcP, (137,601,1200), a=a,b=b,ps=ps, dtype=float)
fh.close()

К сожалению, я получаю IndexError : Индекс не может быть многомерным

У кого-нибудь есть идея, в чем может быть причина?Я уже пробовал разные значения формы и разные порядки переменной для функции calcP.

Вот еще немного информации о моих переменных:

Вывод:

gph shape: (137, 601, 1200)
gph type: <class 'numpy.ma.core.MaskedArray'>
ps shape (601, 1200)
ps type: <class 'numpy.ma.core.MaskedArray'>
ps mask: False
a shape: (137,)
a type: <class 'netCDF4._netCDF4.Variable'>
b shape: (137,)
b type: <class 'netCDF4._netCDF4.Variable'>

1 Ответ

1 голос
/ 07 марта 2019

Я думаю, что ваши a и b должны быть массивами, а не netCDF4.Variable. Таким образом,

a = fh.variables['a'][:]
b = fh.variables['b'][:]

Также я думаю, что вам может понадобиться установить dtype=int во 2-й последней строке.

...