Python: преобразовать одномерный массив (с равной системой координат площади) в двумерный массив (с Geographi c Система координат координат) - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть одномерный массив данных (например, Осадки [осадок]). Кроме того, у меня есть 1D массив широты (минимум -90 градусов, максимум +90 градусов) и 1D долготы (минимум 0, максимум 360 градусов), представляющие координаты этих данных. Система координат " равная область ". Это глобальный набор данных.

Мой вопрос заключается в том, как я могу преобразовать этот одномерный массив в двумерный массив с помощью системы координат Geographi c (т. Е. Равномерно распределенная сетка, параллели и меридианы) с пространственным разрешением 1 на 1 градус, чтобы у меня был массив 180 * 360 (предпочтительно с использованием pyproj / xarray)?

Спасибо!

Ниже приводится информация о набор данных:

xarray.Dataset

Размеры: (eqcell: 41252)

Размеры без координат: eqcell

Переменные данных:

lat                (eqcell) float32 dask.array chunksize=(41252,), meta=np.ndarray

lon                (eqcell) float32 dask.array chunksize=(41252,), meta=np.ndarray

precip              (eqcell) float32 dask.array chunksize=(41252,), meta=np.ndarray

1 Ответ

0 голосов
/ 26 апреля 2020

Похоже, что вы хотите scipy.interpolate.griddata . Вот пример из документации:


Предположим, мы хотим интерполировать 2-D функцию

>>> def func(x, y):
...     return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2

в сетке в [0, 1] x [0, 1]

>>> grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j]

, но мы знаем только его значения в 1000 точках данных:

>>> points = np.random.rand(1000, 2)
>>> values = func(points[:,0], points[:,1])

Это можно сделать с помощью griddata - ниже мы опробуем все методы интерполяции:

>>> from scipy.interpolate import griddata
>>> grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')
>>> grid_z1 = griddata(points, values, (grid_x, grid_y), method='linear')
>>> grid_z2 = griddata(points, values, (grid_x, grid_y), method='cubic')

Можно видеть, что точный результат в некоторой степени воспроизводится всеми методами, но для этой гладкой функции кусочно-интерполяционный кубический c дает наилучшие результаты:

>>> import matplotlib.pyplot as plt
>>> plt.subplot(221)
>>> plt.imshow(func(grid_x, grid_y).T, extent=(0,1,0,1), origin='lower')
>>> plt.plot(points[:,0], points[:,1], 'k.', ms=1)
>>> plt.title('Original')
>>> plt.subplot(222)
>>> plt.imshow(grid_z0.T, extent=(0,1,0,1), origin='lower')
>>> plt.title('Nearest')
>>> plt.subplot(223)
>>> plt.imshow(grid_z1.T, extent=(0,1,0,1), origin='lower')
>>> plt.title('Linear')
>>> plt.subplot(224)
>>> plt.imshow(grid_z2.T, extent=(0,1,0,1), origin='lower')
>>> plt.title('Cubic')
>>> plt.gcf().set_size_inches(6, 6)
>>> plt.show()

plot

...