【发布时间】:2020-02-11 16:25:58
【问题描述】:
我需要从不规则的纬度/经度列表中创建一个数据集。这些已堆叠成一个“像素”列表,我需要将其拆开并转换回常规的纬度/经度网格。因为网格中每个像素的数据值都不完整,我需要将缺失值填充为np.nan。
我无法使用不规则的经纬度点(像素)列表创建 xr.Dataset。
可重现的示例:
创建我的数据外观示例
注意:数据不完整,形状为(99,),因此我不能简单地重新调整数据以适应独特的纬度/经度。
import numpy as np
import xarray as xr
unique_latitudes = np.arange(0, 10)
unique_longitudes = np.arange(0, 10)
_ = np.array((np.meshgrid(latitudes, longitudes))).T.reshape(-1, 2)
# we don't have a complete grid of pixels
pixels = _[:99]
latitudes = pixels[:, 0]
longitudes = pixels[:, 1]
pixel_id = [i for i in range(len(pixels))]
# there is one missing datapoint (only 99 pixels so can't simply reshape data)
data = np.random.choice([0,1,2], (pixels.shape[0]))
coords = {'pixel': pixels}
dims = ['pixel']
xr.Dataset({'data': (dims, data)})
Out[]:
<xarray.Dataset>
Dimensions: (pixel: 99)
Dimensions without coordinates: pixel
Data variables:
data (pixel) int64 1 1 2 0 1 0 1 1 0 1 1 2 1 ... 2 2 0 0 1 2 1 2 0 1 1 2
这是就我的数据而言。我有一个长度为 99 的数组。但是这些值中的每一个都对应一个纬度和一个经度。
pixels[:5]
Out[]:
array([[0, 0],
[0, 1],
[0, 2],
[0, 3],
[0, 4]])
我想要的是带有适当标记的lat/lon 坐标的xr.Dataset
data = np.random.choice([0,1,2], (100)).astype('float')
data = data.reshape(len(unique_latitudes), len(unique_longitudes))
# remember there is one missing data point in the above data
data[np.unravel_index(99, data.shape)] = np.nan
correct_dims = ['lat', 'lon']
correct_coords = {'lat': unique_latitudes, 'lon': unique_longitudes}
correct_ds = xr.Dataset({'data': (correct_dims, data)}, coords=correct_coords)
correct_ds
Out[]:
<xarray.Dataset>
Dimensions: (lat: 10, lon: 10)
Coordinates:
* lat (lat) int64 0 1 2 3 4 5 6 7 8 9
* lon (lon) int64 0 1 2 3 4 5 6 7 8 9
Data variables:
data (lat, lon) float64 0.0 1.0 0.0 1.0 0.0 2.0 ... 2.0 1.0 1.0 2.0 nan
【问题讨论】:
-
IIUC,您当前的数据很稀疏。你试过stack/unstack吗?
-
但我无法将二维
pixel属性作为维度分配给原始dataset:coords = {'pixel': pixels}, dims = ['pixel'] -
否则可以拆垛!
-
你能先把它转换成多索引吗?这就是你可以取消堆叠的格式
标签: python python-3.x numpy python-xarray