如何为含掩码/NaN值的经纬度数组高效生成陆地掩码?
高效处理带NaN/掩码的经纬度数组生成陆地掩码
核心思路
避开逐元素循环,先筛选出所有有效经纬度坐标,利用global_land_mask的批量处理优势完成陆地判断,再将结果回填到原数组对应的位置。这种方式完全复用库的向量化高效计算能力,避免循环带来的性能损耗。
具体实现步骤及代码示例
情况1:处理含NaN的普通Numpy数组
import numpy as np from global_land_mask import globe # 示例:3000×3000的经纬度数组(含随机NaN) lon = np.random.uniform(-180, 180, (3000, 3000)) lat = np.random.uniform(-90, 90, (3000, 3000)) lon[np.random.rand(*lon.shape) < 0.1] = np.nan lat[np.random.rand(*lat.shape) < 0.1] = np.nan # 1. 筛选有效坐标的布尔掩码 valid_mask = np.isfinite(lon) & np.isfinite(lat) # 提取有效经纬度 valid_lat = lat[valid_mask] valid_lon = lon[valid_mask] # 2. 批量调用is_land,这一步是向量化操作,效率极高 valid_land_results = globe.is_land(valid_lat, valid_lon) # 3. 初始化结果数组并回填有效结果 land_mask = np.full(lon.shape, False, dtype=bool) land_mask[valid_mask] = valid_land_results
情况2:处理带掩码的Masked Array
import numpy as np from numpy.ma import masked_array from global_land_mask import globe # 示例:3000×3000的带掩码经纬度数组 lon_ma = masked_array( np.random.uniform(-180, 180, (3000, 3000)), mask=np.random.rand(3000, 3000) < 0.1 ) lat_ma = masked_array( np.random.uniform(-90, 90, (3000, 3000)), mask=np.random.rand(3000, 3000) < 0.1 ) # 1. 合并掩码:只要经纬度任意一个有掩码,就视为无效坐标 valid_mask = ~lon_ma.mask & ~lat_ma.mask valid_lat = lat_ma[valid_mask] valid_lon = lon_ma[valid_mask] # 2. 批量处理有效坐标 valid_land_results = globe.is_land(valid_lat, valid_lon) # 3. 生成结果:可以选择普通数组或保留掩码的Masked Array land_mask = np.full(lon_ma.shape, False, dtype=bool) land_mask[valid_mask] = valid_land_results # 若需要保留掩码结构,可转为Masked Array land_mask_ma = masked_array(land_mask, mask=~valid_mask)
性能说明
这种方法将原本的逐元素循环替换为Numpy向量化操作,完全发挥global_land_mask的原生性能优势,3000×3000规模的数组处理耗时可压缩至几秒以内,彻底解决循环处理的低效问题。
内容的提问来源于stack exchange,提问作者Pixel_Bear
相关产品推荐
相关产品推荐

