Python:将1D数组(具有等面积坐标系)转换为2D数组(具有地理坐标系)

2024-10-01 02:33:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个一维数据数组(例如降水[precip])。此外,我还有1D纬度(最小-90度,最大+90度)和1D经度(最小0度,最大360度)数组,表示此数据的坐标。坐标系为“等面积”。这是一个全球数据集

我的问题是如何将该一维阵列转换为具有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

Tags: 数据尺寸np数组arraymetadaskxarray
1条回答
网友
1楼 · 发布于 2024-10-01 02:33:20

看起来你想要scipy.interpolate.griddata。以下是文档中的示例:


假设我们要插值二维函数

>>> 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')

可以看出,所有方法都在一定程度上再现了精确结果,但对于该平滑函数,分段三次插值给出了最佳结果:

>>> 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

相关问题 更多 >