如何使用Xarray提取百分比值



我使用xarray从NetCDF文件(.nc(中提取数据。我需要在一组维度(纬度、经度、深度(的每个时间步长提取其中一个变量(化学物质浓度(的第75个百分位数。我用下面的代码来做这个

df = xr.open_dataset("10y_125_365_concentration.nc") 
c_75 = df.concentration.quantile(0.75, dim=('latitude', 'longitude', 'depth')) 

在给出特定的浓度值之前,结果给出了前几个时间步长的输出"0"。代码似乎计算了整个阵列的第75个百分位值,然而,我需要提取阵列中不包括零的75个百分值(具有0以外值的浓度阵列的长度随着时间的推移而变化,零值的数量随着时间步长的增加而减少(

xr.DataArray.quantile有一个可选参数skipna,对于float数据类型,默认为True。因此,默认情况下,如果df.concentration有浮点数据,xarray将在后台使用np.nanpercentile,并跳过无效数据。

所以,您所需要做的就是告诉xarray 0是无效的,应该跳过。您可以使用DataArray.where执行此操作,它将在条件为False:的任何位置返回np.nan

c_75 = df.concentration.where(df.concentration != 0).quantile(
0.75, dim=('latitude', 'longitude', 'depth')
)

性能说明:当前,当在高维阵列的轴的子集上操作时,np.nanpercentilenp.percentile慢得多(例如,大多数xarray用例(。在您的情况下,这似乎是不可避免的,但在其他情况下,如果您的数组中没有无效值,最好传递skipna=False,以允许xarray在后台使用更快的np.percentile操作。但是要小心,如果存在NaN,则np.percentile会返回不正确的结果。

最新更新