You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为含掩码/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:35:25