Когда я извлекаю данные из файла 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)