высокое разрешение Данные повторного анализа

Когда я извлекаю данные из файла netCDF Reanalysis (переменное давление (SLP), 01.01.2014), данные имеют очень высокое разрешение (сетка 9 км), что делает результирующее изображение довольно шумным. Я хотел бы поместить данные в сетку с более низким разрешением (например, 1 градус). Я пытаюсь использовать функции meshgrid и gridata, но по неопытности не могу заставить их работать. Кто-нибудь знает как решить? Спасибо.

    from netCDF4 import Dataset
    import numpy as np
    from scipy.interpolate import griddata
    file = Dataset('slp_2014_01_01.nc', 'r')
    # Printing variables
    print ' '
    print ' '
    print '----------------------------------------------------------'
    for i,variable in enumerate(file.variables):
        print '   '+str(i),variable
        if i == 2:
            current_variable = variable
    print ' '
    print 'Variable: ', current_variable.upper()
    print 'File name:  ', file_name
    lat  = file.variables['lat'][:]
    lon  = file.variables['lon'][:]
    slp = file.variables['slp'][:]

    lon_i = np.linspace(lon[0], lon[len(REANALYSIS_lon)-1], num=len(lon)*2, endpoint=True, retstep=False)    
    lat_i = np.linspace(lat[0], lat[len(lat)-1], num=len(lat)*2, endpoint=True, retstep=False)

    lon_grid, lat_grid = np.meshgrid(lon_i,lat_i)

    temp_slp = np.asarray(slp).squeeze()
    new_slp = temp_slp.reshape(temp_slp.size)

    slp_grid = griddata((lon, lat), new_slp, (lon_grid, lat_grid),method='cubic')

Как я уже упоминал, я попытался использовать функции meshgrid и datagrid, но выдал следующую ошибку:

Отслеживание (последний вызов последним): файл «REANALYSIS_LOCAL.py», строка 346, в
lon, lat, time, var, variavel_atual = netCDF_builder_local (caminho_netcdf_local, nome_arquivo, dt) Файл «REANALYSIS_LOCAL3, строка 14 в netCDF_builder_local
slp_grid = griddata ((lon, lat), new_slp, (lon_grid, lat_grid), method = 'cubic')
Файл "/home/carlos/anaconda/lib/python2.7/site-packages /scipy/interpolate/ndgriddata.py ", строка 182, в griddata points = _ndim_coords_from_arrays (points)
Файл" interpnd.pyx ", строка 176, в scipy.interpolate.interpnd._ndim_coords_from_arrays (scipy / interpolate : 4064)
Файл "/home/carlos/anaconda/lib/python2.7/site-packages/numpy/lib/stride_tricks.py", строка 101, в broadcast_arrays "несовместимые измерения на оси% r." % (axis,))
ValueError: несоответствие формы: два или более массива имеют несовместимые размеры по оси 0.

Размеры переменных:
lon: (144,)
lat: (73,)
lon_i: (288,)
lat_i: (146,)
lon_grid: (146, 288)
lat_grid: (146, 288)
new_slp: (10512,)

Значения в new_slp: new_slp: [102485. 102485. 102485. ..., 100710. 100710. 100710.]

Цель состоит в том, чтобы увеличить значения переменных (lon, lat и slp), потому что разрешение повторного анализа выше. Затем разрешение может быть самым подробным (больше точек).

Например: переменная lat имеет точки:

Исходная переменная размера lat: (73,)
lat: [90. 87,5 85. 82,5 80. 77,5 75. 72,5 70. 67,5 65. 62,5 60. 57,5 ​​55. 52,5 50. 47,5 45. 42,5 40. 37,5 35. 32,5 30. 27,5 25. 22,5 20. 17,5 15. 12,5 10. 7,5 5. 2,5 0. -2,5 -5. -7,5 -10. -12,5 -15. -17,5 -20. -22,5 -25. -27,5 -30. -32,5 -35. -37,5 -40. -42,5 -45. -47,5 -50. -52,5 -55. -57,5 -60. -62,5 -65. -67,5 -70. -72,5 -75. -77,5 -80. -82,5 -85. -87,5 -90. ]

Когда я определяю строку кода: lat_i = np.linspace (lat [0], lat [len (lat) -1], num = len (lat) * 2, endpoint = True, retstep = False), я удвоил значения переменная широты la_i (146,)

широта _i: [90. 88.75862069 87.51724138 86.27586207 85.03448276 83.79310345 82.55172414 81.31034483 80.06896552 78.82758621 77.5862069
...
-78.82758621 -80.06896552 -81.310344814 -82086.75345345 -88587824 -82086278345345345248325325345 -8325325348 ]

Идея, которая мне нужна, та же, что и в этом коде, где x - lon, y - lat, а slp - z.
из scipy.interpolate import griddata import numpy as np import matplotlib.pyplot as plt

x=np.linspace(1.,10.,20)
y=np.linspace(1.,10.,20)
z=z = np.random.random(20)
xi=np.linspace(1.,10.,40)
yi=np.linspace(1.,10.,40)

X,Y= np.meshgrid(xi,yi)

Z = griddata((x, y), z, (X, Y),method='nearest')

plt.contourf(X,Y,Z)

person Carlos Alberto Bertin    schedule 27.09.2015    source источник


Ответы (2)


В зависимости от вашей конечной цели вы можете использовать cdo для регистрации всего файла.

cdo remapbil,r360x180 infile outfile

или просто постройте каждое второе или третье значение из исходного файла следующим образом:

plt.pcolormesh(lon[::2,::2],lat[::2,::2],var1[::2,::2])

Сообщение об ошибке, которое вы показываете, просто говорит о том, что размеры не имеют большого значения, просто распечатайте форму ваших переменных до появления ошибки и попытайтесь заставить ее работать.

Почему ваш код не работает? Выбранный вами метод требует ввода координат в виде пар долготы и широты для точек данных, а не координат сетки. Если у вас есть точки данных формы 10000, ваши координаты должны соответствовать форме (10000,2), а не (100,100). Но поскольку данные griddata предназначены для неструктурированных данных, они не будут эффективны для ваших целей, я предлагаю использовать что-то вроде scipy.interpolate.RegularGridInterpolator

Но в любом случае, если вам нужно использовать интерполированные данные более одного раза, я предлагаю создавать новые файлы netCDF с помощью cdo и обрабатывать их, вместо того, чтобы интерполировать данные каждый раз, когда вы запускаете свой скрипт.

person kakk11    schedule 28.09.2015
comment
спасибо за ответ ... но я добавил более подробную информацию о своей цели / о том, что мне нужно сделать. - person Carlos Alberto Bertin; 28.09.2015
comment
Хорошо, сначала вы говорите, что хотите разрешение в 1 градус вместо 9 км? Но затем вы создаете новые координаты (lon_i, lat_i), которые в два раза больше исходного массива, что позволяет получить более точное разрешение ?! Вы все еще можете сделать это с помощью cdo, который разработан именно для этой цели. - person kakk11; 29.09.2015
comment
Я отредактировал свой первый ответ, чтобы объяснить, почему Ваш код не работает. - person kakk11; 29.09.2015

Спасибо за вашу помощь. На самом деле моя проблема была в размерах. Учусь работать с океанографическими данными. Итак, я решил проблему с этим кодом.

lonbounds = [25,59]
latbounds = [-10,-33]

#longitude lower and upper index
lonli = np.argmin(np.abs(lon - lonbounds[0]))
lonui = np.argmin(np.abs(lon - lonbounds[1]))  

#latitude lower and upper index
latli = np.argmin(np.abs(lat - latbounds[0]))
latui = np.argmin(np.abs(lat - latbounds[1])) 

#limiting of the interest region/data
lon_f = file.variables['lon'][lonli:lonui]  
lat_f = file.variables['lat'][latli:latui] 
slp_f = file.variables['slp'][0,latli:latui,lonli:lonui] 

#creating a matrix with the filtered data (area to be searched) for use in gridData function of python
lon_f_grid, lat_f_grid = np.meshgrid(lon_f,lat_f)

#adjusting the data (size 1) for use in gridData function of python
lon_f1 = lon_f_grid.reshape(lon_f_grid.size)
lat_f1 = lat_f_grid.reshape(lat_f_grid.size)
slp_f1 = slp_f.reshape(slp_f.size)

#increasing the resolution of data (1000 points) of longitude and latitude for the data to be more refined
lon_r = np.linspace(lon_f[0], lon_f[len(lon_f)-1], num=1000, endpoint=True, retstep=False)
lat_r = np.linspace(lat_f[0], lat_f[len(lat_f)-1], num=1000, endpoint=True, retstep=False)

#creating a matrix with the filtered data (area to be searched) and higher resolution for use in gridData function of python
lon_r_grid, lat_r_grid = np.meshgrid(lon_r,lat_r)

#applying gridata that can be generated since pressure (SLP) with higher resolution.
slp_r = griddata((lon_f1,lat_f1),slp_f1,(lon_r_grid,lat_r_grid),method='cubic')

Обнимаю, Карлос.

person Carlos Alberto Bertin    schedule 05.10.2015