繁体   English   中英

从 xarray 数据数组中提取极值

[英]extract extreme values from xarray dataarray

我有一个相当大的数据集,需要在该数据集中找到极值,包括坐标。

真实的数据集要大得多,但让我们用这个来测试:

import xarray as xr
import numpy as np
import pandas as pd

values = np.array(
    [[[3, 1, 1],
      [1, 1, 1], 
      [1, 1, 1]],

     [[1, 1, 1],
      [1, 1, 1],
      [1, 1, 4]],

     [[1, 1, 1],
      [1, 1, 1],
      [1, 1, 5]]]
)

da = xr.DataArray(values, dims=('time', 'lat', 'lon'), 
    coords={'time': list(range(3)), 'lat': list(range(3)), 'lon':list(range(3))})

我想在这个数据数组中找到所有大于 2 的值。我在这里找到了这个解决方案:

da.where(da>2, drop=True)

但即使在这个小例子中,这也会产生比值更多的 nans:

array([[[ 3., nan],
        [nan, nan]],

       [[nan, nan],
        [nan,  4.]],

       [[nan, nan],
        [nan,  5.]]])

在我的实际数据集中情况更糟。

我尝试编写一个辅助函数将其转换为熊猫数据框,如下所示:

def find_val(da):
    res = pd.DataFrame(columns=['Time', 'Latitude', 'Longitude', 'Value'])
    for time_idx, time in enumerate(da['time']):
        for lat_idx, lat in enumerate(da['lat']):
            for lon_idx, lon in enumerate(da['lon']):
                value = da.isel(time=time_idx, lat=lat_idx, lon=lon_idx).item()
                if not np.isnan(value):
                    res.loc[len(res.index)] = [time.item(), lat.item(), lon.item(), value]
    return res

find_val(da.where(da>2, drop=True))

这会产生我想要的输出,但是 3 个嵌套的 for 循环似乎过多。

    Time  Latitude  Longitude  Value
0   0.0   0.0       0.0        3.0
1   1.0   1.0       1.0        4.0
2   2.0   1.0       1.0        5.0

关于如何改进这一点有什么好的建议吗?

已经有转换为 Pandas 的实现

 DataArray.to_dataframe(name=None, dim_order=None)

https://docs.xarray.dev/en/stable/generated/xarray.DataArray.to_dataframe.html

附带说明一下,如果您要删除没有特定范围的极值,那么您可能需要查看异常值检测https://scikit-learn.org/stable/modules/outlier_detection.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM