【问题标题】:Indexing xarray data with variable length DataArray使用可变长度 DataArray 索引 xarray 数据
【发布时间】:2020-10-26 15:47:09
【问题描述】:

我正在尝试使用 DataArray 索引从 xarray 数据集中提取数据。我的目标是沿着与数组重叠的不同线段获取数据。为此,我获得了每条线的索引(根据长度,它们的大小不同)。

例如对于第 1 行:x = [1,2,3], y=[7,8,9] 和第 2 行类似的是 x=[1,4,5,6,8], y=[0,2,7,9,6] 等等,我有一些行是 100x 2。为此,我尝试如下:

df=xarray_dataset
indx=xr.DataArray([[1,2,3],[1,4,5,6,8],[2,3]])
indy=xr.DataArray([[7,9,8],[0,2,7,9,6],[4,5]])
dx_sel=df.isel(x=indx,y=indy)

但是据我所知,每个数据数组索引的长度需要相等。有没有办法可以处理这些问题。基本上,这些索引代表数据帧中不同段的 x 和 y 坐标并获得每个段的平均值,如果只有少数我可以为每个段使用循环,我有 100 个这样的段索引,但是为每个段使用循环在计算上效率不高。

这也是 numpy 数组的类似问题。有没有办法在索引中传递 NaN 或类似的东西,以便我们可以制作相同的形状,但不会为该索引提取数据。

【问题讨论】:

    标签: numpy python-xarray


    【解决方案1】:

    您可以使用set_index -> unstack 机制,它基于pd.MultiIndex

    In [4]: df = xr.DataArray(np.arange(110).reshape(10, 11),  
       ...:                   dims=['x', 'y'])  
    In [5]: indx=xr.DataArray([1,2,3, 1,4,5,6,8, 2,3], 
       ...:                   dims=['index'],  
       ...:                   coords={'i': ('index', [0,0,0, 1,1,1,1,1, 2,2]), 
       ...:                           'j': ('index', [0,1,2, 0,1,2,3,4, 0,1])}) 
       ...:  
       ...: indy=xr.DataArray([7,9,8, 0,2,7,9,6, 4,5], dims=['index'], 
       ...:                   coords={'i': ('index', [0,0,0, 1,1,1,1,1, 2,2]), 
       ...:                           'j': ('index', [0,1,2, 0,1,2,3,4, 0,1])})       
    
    In [8]: df.isel(x=indx, y=indy).set_index(index=['i', 'j']).unstack('index')                                         
    Out[8]: 
    <xarray.DataArray (i: 3, j: 5)>
    array([[18., 31., 41., nan, nan],
           [11., 46., 62., 75., 94.],
           [26., 38., nan, nan, nan]])
    Coordinates:
      * i        (i) int64 0 1 2
      * j        (j) int64 0 1 2 3 4
    

    这里indxindy有无量纲坐标,ij,本质上是二维空间中索引的原始位置。

    【讨论】:

    • 谢谢@Keisuke。我已经尝试过你的方法,但仍然无法得到我所期望的。我已就我的问题添加了更多详细信息。
    • 也许我还不明白你在期待什么。我认为没有一种简单的方法可以处理这种可变长度数组。我的建议是把它放到一个大的一维数组中,并附上它的坐标(我的回答中的'i'和'j'。)
    • 我现在已经用我的问题的更多细节更新了我的问题。让我知道您对此的看法。
    猜你喜欢
    • 2019-01-18
    • 2019-08-10
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2019-06-28
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多