如何用Python的xarray对LAI栅格数据进行重分类?
解决xarray.DataArray栅格重分类问题
首先明确你的需求:将0-0.4映射为1,0.4-1.0映射为2,1.0-1.4映射为3,1.4-1.8映射为4。你的两种方法存在问题,以下是问题分析和正确实现方式:
你的方法问题分析
- 方法一:使用
np.where索引赋值的逻辑顺序是对的(从高阈值到低阈值,避免覆盖),但这种方式不符合xarray的原生操作习惯,且若数据是延迟加载(如dask数组)会触发不必要的计算,甚至可能因索引广播问题导致赋值失效。 - 方法二:完全错误使用了
xr.where,xr.where的正确语法是xr.where(条件, 满足条件的取值, 不满足条件的取值),且你没有将计算结果赋值给变量,原数据根本未被修改。
正确实现方式
方式一:嵌套使用xr.where(推荐)
利用xr.where的嵌套特性,从高到低判断阈值,生成新的分类后DataArray:
LAI_reclassified = xr.where(LAI > 1.4, 4, xr.where(LAI > 1.0, 3, xr.where(LAI > 0.4, 2, 1)))
这种方式会保留原数据的维度、坐标和属性,且支持延迟加载的数组。
方式二:结合pandas.cut实现
如果习惯用区间划分的方式,可以借助pandas的cut函数:
import pandas as pd # 定义区间边界和对应标签 bins = [0, 0.4, 1.0, 1.4, 1.8] labels = [1, 2, 3, 4] # 展平数据处理后重塑形状,再转回xarray.DataArray LAI_reclassified = xr.DataArray( pd.cut(LAI.data.flatten(), bins=bins, labels=labels, include_lowest=True).reshape(LAI.shape), dims=LAI.dims, coords=LAI.coords, attrs=LAI.attrs )
include_lowest=True确保0值被包含在第一个区间内。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

