读取netcdf文件-掩码-内存分配



我已经能够读取netcdf文件:

import xarray as xr
ds_disk = xr.open_dataset(file_nc_in)

然后我读了一个形状文件:

shapefile_path = 'shapefile.shp'
shp_noce       = gpd.read_file(shapefile_path)

这是我的投影:

shp_noce.crs
erived Projected CRS: EPSG:32632>
Name: WGS 84 / UTM zone 32N
Axis Info [cartesian]:
- E[east]: Easting (metre)
- N[north]: Northing (metre)
Area of Use:
- name: Between 6°E and 12°E, northern hemisphere between equator and 84°N, onshore and offshore. Algeria. Austria. Cameroon. Denmark. Equatorial Guinea. France. Gabon. Germany. Italy. Libya. Liechtenstein. Monaco. Netherlands. Niger. Nigeria. Norway. Sao Tome and Principe. Svalbard. Sweden. Switzerland. Tunisia. Vatican City State.
- bounds: (6.0, 0.0, 12.0, 84.0)
Coordinate Operation:
- name: UTM zone 32N
- method: Transverse Mercator
Datum: World Geodetic System 1984 ensemble
- Ellipsoid: WGS 84
- Prime Meridian: Greenwich

我想关注这篇文章,以便屏蔽我的netcdf文件。

然而,我得到以下错误:

Unable to allocate 21.9 GiB for an array with shape (14245, 643, 641) and data type float32

有可能一步一步地工作吗?我怎样才能去掉nan。我不认为保存所有数据是有用的,即使是剪切区域的数据。

有什么建议吗?

感谢

如果您只想限制加载的数据量,我会将数据剪辑到边界框中,而不是屏蔽数组。掩蔽是一个复杂的操作,需要构建与数组大小相同的lat/lon值网格;根据您的数组维度,屏蔽操作可能比简单地加载数据更密集。此外,一旦你完成了这个复杂的遮罩,你仍然会有一个形状边界框大小的完整阵列——形状之外的区域将被转换为NaN,但这些仍然需要内存。

根据您的问题,听起来您在墨卡托投影(EPSG:3335(中有一个数据集,具有dimsxy和lat/lon(WGS84/EPSG:4326(坐标的形状文件。我将形状文件转换为Mercator,然后使用xr.Dataset.sel:选择位于GeoDataFrame的.total_bounds内的数组部分

ds # an xarray.Dataset with dims (x, y, ...)
shapes # a geopandas.GeoDataFrame
shapes_mercator = shapes.to_crs("epsg:3395")
minx, miny, maxx, maxy = shapes_mercator.total_bounds
subset = ds.sel(
y=((ds.y >= miny) & (ds.y <= maxy)),
x=((ds.x >= miny) & (ds.x <= maxx))
)

现在,数据集中的数据应该会明显减少。您可以使用ds[varname].nbytes检查每个阵列中的数据量,例如使用ds[varname].nbytes / 1024 ** 3检查GB数。如果该数量可以在您的计算机上加载(通常您希望至少是阵列大小的2-3x在您的机器上可用,以便能够在您的阵列上工作(,那么您可以使用subset = subset.load()加载数据

相关内容

  • 没有找到相关文章

最新更新