【问题标题】:Python, Xarray: Rank variable by descending order for each cell in an arrayPython,Xarray:按数组中每个单元格的降序排列变量
【发布时间】:2021-05-16 18:12:22
【问题描述】:

我有一个维度为 year、lat、lon 和变量 x 的数据集,我正在对其执行函数以确定其他一些统计数据。

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

例子:

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

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

在计算的排名处提取 x 值,例如排名=2

该 lat/lon = 6 的最终排名值

这个过程非常适合单点,但我正在尝试对整个数组中的每个网格单元纬度/经度执行这个过程,我觉得这应该很简单,但我无法将这些函数应用到一个完整的数组

谢谢!

【问题讨论】:

标签: python arrays python-xarray


【解决方案1】:

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

如果您的数组适合内存,您始终可以使用.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 在 cmets 中建议的那样,可能是最好的解决方案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2014-02-09
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    相关资源
    最近更新 更多