【问题标题】:python Xarray DataArray: how do you add an additional coordinate to an existing dimensionpython Xarray DataArray:如何向现有维度添加附加坐标
【发布时间】:2018-05-17 01:52:39
【问题描述】:

我刚开始使用Xarray DataArray,我不确定如何将新坐标轴添加到现有维度。谁能指出我正确的方向。

所以我有一个现有的数组,看起来像:

 demo_results = np.zeros([10, 20, 5])
 cols = ['c1', 'c2', 'c3', 'c4', 'c5']
 t = xr.DataArray(demo_results, coords={'sim': cols}, dims=('run', 'year', 'sim'))

所以这会给我一个 3 维数组,沿着“sim”维度有 5 个坐标。现在我想在名为“c6”的“sim”维度上添加一个额外的坐标,但我不知道该怎么做?我在文档中没有看到任何信息或示例。在pandas 中,我只会引用df.loc[:, 'c6] = 0 之类的新维度,这样就可以了。但我用Xarray 尝试过类似的操作,例如:

 t.loc['sim', 'c6'] = 0 

但我出错了:TypeError: invalid indexer array, does not have integer dtype: array('sim', dtype='<U3')

我想我仍然掌握 DataArray 索引的窍门。

【问题讨论】:

    标签: python python-xarray


    【解决方案1】:

    Xarray 在底层使用 numpy/dask 数组,因此不支持自动扩展(就像在 Pandas 中一样)。

    如果您提前知道列的名称和数量,则可以提前创建整个区域。例如

    demo_results = np.zeros([10, 20, 6])
    cols = ['c1', 'c2', 'c3', 'c4', 'c5', 'c6']
    t = xr.DataArray(demo_results, coords={'sim': cols}, dims=('run', 'year', 'sim'))
    t.loc[{'sim': 'c6'}] = -999.  # or whatever value you like
    

    注意,当您使用不支持项目分配的 dask 数组时,这将不起作用。

    如果你使用的是 dask,无法提前创建完整的数组,你可以一直使用xarray.concat

    demo_results = np.zeros([10, 20, 1]) - 999.
    cols = ['c6']
    t6 = xr.DataArray(demo_results, coords={'sim': cols}, dims=('run', 'year', 'sim'))
    
    # concat old+new
    t = xr.concat([t, t6], dim='sim')
    

    【讨论】:

    • 好的,我知道了。是的,这更有意义。所以我基本上需要从一开始就知道所有的坐标和尺寸。我并不总是预先知道“sim”维度中所有坐标的编号/名称,因此如果需要,我会尝试做一些类似扩展 DataArray 的事情。但我可以想办法解决这个问题。感谢您的帮助。
    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 2018-11-21
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2020-07-15
    • 2017-10-10
    相关资源
    最近更新 更多