Python,Xarray:按数组中每个单元格的降序排列变量

问题描述

我有一个维度为年、纬度、经度和变量 x 的数据集,我正在执行一个函数来确定其他一些统计数据。

对于我选择的一个纬度/经度单元,我能够从最大到最小对 1000 年中每一年的单个 x 值进行排序,并去除 nans,留下一个排序的一维数组。从那里,我做了一个函数来确定给定的秩值,然后从一维数组中提取该给定秩的 x 值。

示例:

x 值数组 = [6,10,5,nan,4,3]

排序数组 = [10,6,3]

在计算出的排名处拉取 x 值,比如 rank=2

该纬度/经度 = 6 处的最终排名值

这个过程对单点效果很好,但我试图对整个阵列中的每个网格单元经纬度执行这个过程,我觉得这应该很简单,但是我在将这些函数应用到一个完整的数组

谢谢!

解决方法

如果您包含单个单元格的代码,这可能会有所帮助。还有,你哪里有问题?

如果您的数组适合内存,您始终可以使用 .values 获取底层 numpy 数组,然后应用例如sortargsort;只要确保你选择了正确的轴。这些 numpy 函数通常总是作用于整个数组。

https://numpy.org/doc/stable/reference/generated/numpy.sort.html https://numpy.org/doc/stable/reference/generated/numpy.argsort.html

请注意,为了提高内存访问效率,最好对最后一个轴进行排序。这可能需要转置您的数组,以便 year 是最后一个维度。

有关更多背景信息,请参阅此答案: What is the difference between contiguous and non-contiguous arrays?

apply_ufunc,就像 Ray Bell 在评论中建议的那样可能是最好的解决方案。

如果问题是您的数组太大而无法放入内存,请尝试分块读取数据集(通过 x 和 y,而不是年份),并且 apply_ufunc 方法对于使用 dask 流式传输数据变得必要.