[英]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.