【问题标题】:Drop coordinate from an xarray DataArray从 xarray DataArray 中删除坐标
【发布时间】:2020-07-15 02:52:29
【问题描述】:

我有一个 xarray DataArray,如下所示,形状为 (1,5,73,144,17),我正在尝试删除或删除“级别”坐标。所以,最终,我需要变量具有 shape = (1,5,73,144)。

stdna
Out[717]: 
<xarray.DataArray 'stack-6e9b86fc65e3f0fda2008a339e235bc7' (variable: 1, week: 5, lat: 73, lon: 144, 
level: 17)>
dask.array<stack, shape=(1, 5, 73, 144, 17), dtype=float32, chunksize=(1, 1, 73, 144, 17), 
chunktype=numpy.ndarray>
Coordinates:
* lon       (lon) float32 0.0 2.5 5.0 7.5 10.0 ... 350.0 352.5 355.0 357.5
* lat       (lat) float32 90.0 87.5 85.0 82.5 80.0 ... -82.5 -85.0 -87.5 -90.0
* level     (level) float32 1000.0 925.0 850.0 700.0 ... 50.0 30.0 20.0 10.0
* week      (week) int64 5 6 7 8 9
* variable  (variable) <U3 'hgt'

我查看了 xarray 文档,但没有帮助。我围绕这个想法尝试了不同的组合,但我通常会得到下面的语句并且坐标没有被删除:

s = stdna.drop('level', dim=None)

Dimensions without coordinates: level

感谢您的帮助!

【问题讨论】:

    标签: python python-xarray


    【解决方案1】:

    你可以使用drop_vars方法:

    In [10]: da
    Out[10]:
    <xarray.DataArray (dim_0: 2, dim_1: 3)>
    array([[0.15928504, 0.47081089, 0.50490985],
           [0.6151981 , 0.41735643, 0.2576089 ]])
    Coordinates:
        x        (dim_0, dim_1) float64 0.1593 0.4708 0.5049 0.6152 0.4174 0.2576
    Dimensions without coordinates: dim_0, dim_1
    
    In [11]: da.drop_vars('x')
    Out[11]:
    <xarray.DataArray (dim_0: 2, dim_1: 3)>
    array([[0.15928504, 0.47081089, 0.50490985],
           [0.6151981 , 0.41735643, 0.2576089 ]])
    Dimensions without coordinates: dim_0, dim_1
    

    或者reset_coords('level', drop=True 也可以使用

    【讨论】:

      【解决方案2】:

      最初,我查看了 drop 的行为,发现它并没有删除维度。它可用于删除数据变量。

      然后我尝试了这个:

      del stdna['level']
      

      我会说最好的方法是尝试:

      stdna.drop_dims('level')
      

      我还尝试了另一件事:

      stdna = stdna.drop([i for i in stdna.coords if i not in stdna.dims])
      

      看看我是否可以概括这个问题。但不要认为这会很好用。 来自文档:http://xarray.pydata.org/en/stable/generated/xarray.Dataset.drop_dims.html

      【讨论】:

        【解决方案3】:

        派对迟到了,但万一其他人遇到这个......

        您不能像这样删除维度的原因是您的数据实际上是由level 索引的。为了从数据中“移除”级别维度,您需要决定如何减少沿该维度的信息。

        您可以通过各种方式做到这一点。如果您想选择数组中的单个级别,那么 da.sel 就是您要查找的内容,例如:

        stdna.sel(level=1000)
        

        另一方面,也许您希望聚合整个级别维度的数据?例如,您可以取所有级别的平均值:

        stdna.mean(dim='level')
        

        但在不知道如何从按级别索引的 DataArray 到不按级别索引的 DataArray 的情况下,xarray 无法简单地从数据中“删除”它 - 数组仍将成形 (1,5,73,144,17)

        有关这些主题的更多信息,请参阅 indexing and selecting datacomputation: aggregation 上的文档。

        【讨论】:

          【解决方案4】:

          如果您的DataArray 的事件中嵌套了级别,如下所示:

          您需要在MultiIndex 中使用.droplevel()。对于此示例,要删除坐标answer_correct

          da.indexes['event'].droplevel('answer_correct')
          

          【讨论】:

            猜你喜欢
            • 2019-06-28
            • 1970-01-01
            • 2017-10-10
            • 1970-01-01
            • 2020-07-09
            • 1970-01-01
            • 2021-02-02
            • 1970-01-01
            • 2019-03-04
            相关资源
            最近更新 更多