XArray是否有类似argmax的分位数统计函数?如何保留quantile操作的坐标?
解决XArray计算分位数时保留对应time坐标的问题
获取90分位数对应的time坐标
quantile()方法本身返回的是分位统计值,不会保留原维度的坐标——因为分位数可能是插值得到的,不一定对应原数据中的某个具体时间点。如果要找到原数据中最接近90分位数的time点,或者直接取排序后对应分位数位置的time,可以用以下两种方法:
方法1:通过排序取对应位置的time和数值
先对数据在time维度上排序,计算90分位数的位置索引,再用isel提取对应的数据和坐标:
import numpy as np # 计算90分位数的位置(索引从0开始,可根据需求用np.floor/np.ceil调整) q90_pos = int(np.ceil(len(Data.time) * 0.9)) - 1 # 对time维度排序 sorted_data = Data.sortby('time') # 提取对应位置的数值和time坐标 q90_data = sorted_data.isel(time=q90_pos) # 此时q90_data保留lat、lon和time坐标,time即为对应分位数位置的时间
方法2:匹配与分位数值最接近的原数据点
先计算分位数值,再找每个网格点上最接近该值的time:
# 先计算90分位数值 q90_values = Data.quantile(0.9, dim='time') # 计算每个点与分位数值的差值绝对值,找到最小差值对应的time索引 diff = abs(Data - q90_values) q90_time_indices = diff.argmin(dim='time') # 用索引提取对应的time和数据 q90_matched = Data.isel(time=q90_time_indices) # 此时q90_matched的time坐标是每个网格点上最接近90分位数的时间
XArray中类似argmax的分位数函数
XArray没有直接提供返回分位数对应索引的内置函数,但可以通过上述方法间接实现——本质是结合排序、位置计算或argmin/argmax找到对应维度的索引。另外也可以用rank方法先计算每个时间点的百分比排名,再筛选接近0.9的点:
# 计算每个time点在lat/lon网格上的百分比排名(按time维度) rank_data = Data.rank(dim='time', pct=True) # 找到排名最接近0.9的time索引 q90_rank_indices = abs(rank_data - 0.9).argmin(dim='time') # 提取对应数据和time坐标 q90_result = Data.isel(time=q90_rank_indices)
内容的提问来源于stack exchange,提问作者Maxim Couillard
相关产品推荐
相关产品推荐

