#python #numpy #resolution
Вопрос:
У меня есть два набора данных: один смоделированный и один наблюдательный. Мне нужно получить набор данных наблюдений с тем же разрешением, что и модель.
В настоящее время данные модели имеют 100 точек долготы и 100 точек широты, поэтому каждая точка данных составляет 1,8 градуса на 3,6 градуса.
Я попробовал следующее, но точки данных не совсем совпадают, поэтому я не могу объединить наборы данных.
import xarray as xa
import numpy as np
import cmocean.cm as cm
import matplotlib.patches as mpatches
from matplotlib.patches import Patch
from matplotlib.lines import Line2D
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import cartopy.crs as ccrs
import cartopy.feature as cfeat
# =============================================================================
# Step 1: Get data
# =============================================================================
data_model = xa.open_dataset("PD_tavg_out_diss_5.nc",decode_times = False)
sal_obs_data = xa.open_dataset("sal_obs_NS_all.nc",decode_times = False)
temp_obs_data = xa.open_dataset("temp_obs_NS_all.nc",decode_times = False)
data_obs = xa.merge([sal_obs_data,temp_obs_data])
data_obs = data_obs.rename(lon = "longitude",
lat = "latitude")
data_extract = data_model[["O_cons_temp","O_abs_sal"]]
long1 = data_extract.longitude.values
long1[long1>180]-=360
data_extract["longitude"] = long1
data_sorted = data_extract.sortby("longitude")
long2 = data_obs.longitude.values
long2[long2>180]-=360
data_obs["longitude"] = long2
data_sorted_obs = data_obs.sortby("longitude")
long_max = 1.8
long_min = -1.8
lat_max = 60.3
lat_min = 54.9
dep_max = 100
dep_min = 0
tim_max = 35422.0
tim_min = 35421.0
def extract_shelf_sea(long_max, long_min,
lat_max, lat_min,
dep_max, dep_min,
tim_max, tim_min):
# =============================================================================
# Step 3: Extract data
# =============================================================================
extract_model_data = data_sorted.sel(longitude = slice(long_min,long_max),
latitude = slice(lat_min,lat_max),
depth = slice(dep_min,dep_max),
time = slice(tim_min,tim_max))
extract_obs_data = data_obs.sel(time = data_obs.time,
longitude = slice(long_min,long_max),
latitude = slice(lat_min,lat_max))
new_lon = np.linspace(extract_obs_data.longitude[0],extract_obs_data.longitude[7],extract_model_data.sizes['longitude'])
new_lat = np.linspace(extract_obs_data.latitude[0],extract_obs_data.latitude[10],extract_model_data.sizes['latitude'])
obs_interpolated = extract_obs_data.interp(latitude = new_lat, longitude = new_lon)
extract_obs_depth = obs_interpolated.sel(depth = extract_model_data.depth, method="nearest")
Результаты наблюдений:
extract_obs_depth
Out[178]:
<xarray.Dataset>
Dimensions: (depth: 2, latitude: 4, longitude: 2, time: 12)
Coordinates:
* depth (depth) float64 15.07 82.92
* time (time) float32 480.5 481.5 482.5 483.5 ... 489.5 490.5 491.5
* latitude (latitude) float64 54.25 56.42 58.58 60.75
* longitude (longitude) float64 -1.75 1.75
Data variables:
salt (time, depth, latitude, longitude) float64 nan 34.56 ... 35.38
temp (time, depth, latitude, longitude) float64 nan 6.586 ... 8.907
Результаты модели:
extract_model_data
Out[179]:
<xarray.Dataset>
Dimensions: (depth: 2, latitude: 4, longitude: 2, time: 12)
Coordinates:
* time (time) float64 3.542e 04 3.542e 04 ... 3.542e 04 3.542e 04
* longitude (longitude) float64 -1.8 1.8
* latitude (latitude) float64 54.9 56.7 58.5 60.3
* depth (depth) float64 17.5 82.5
Data variables:
O_cons_temp (time, depth, latitude, longitude) float64 5.615 ... 7.437
O_abs_sal (time, depth, latitude, longitude) float64 33.28 ... 35.21
Любые предложения о том, как я могу идеально подобрать широту и долготу, будут высоко оценены. Заранее спасибо.
Кстати, к сожалению, я не могу загрузить наборы данных, так как они слишком большие.
Комментарии:
1. Почему бы не взять саму модель (которая создала данные модели) и не подключить точные значения широты и долготы, которые вам нужны?
2. К сожалению, у меня нет доступа к самому коду модели. Я могу просто запустить на нем моделирование… В противном случае это было бы идеальным решением!
Ответ №1:
Как насчет интерполяции набора данных наблюдений в координаты смоделированного набора данных?
В частности, вы могли бы использовать RectSphereBivariateSpline
из составляющей модуля, что напрямую интерполирует структурированных данных (сведения определены в регулярной сетке, как кажется, это ваш случай) в сферических координатах (я предполагаю, что здесь другие измерения — время и глубина — матч между наборами данных; если нет, вам придется выполнить несколько интерполяций).
Взгляните на пример в документации я связан выше, и если у вас есть какие-либо сомнения, не стесняйтесь спрашивать; я сам использовал эту функцию один раз или дважды, и если я правильно помню, в документации неправильно в одном из координат параметры (я думаю, что это был v
параметр, который вместо того, чтобы быть определенными в [-pi, pi]
интервале, что и врачам, говорит, это на самом деле должно быть [0, 2pi]
-возьми это с щепоткой соли, хотя).