前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >xarray | 数据结构(3)

xarray | 数据结构(3)

作者头像
bugsuse
发布2020-04-21 17:21:37
1.8K0
发布2020-04-21 17:21:37
举报
文章被收录于专栏:气象杂货铺

坐标

坐标是存储在 DataArray 和 Dataset 的 coords 属性中的辅助变量。

代码语言:javascript
复制
>> ds.coords
Coordinates:
    lat             (x, y) float64 42.25 42.21 42.63 42.59
    lon             (x, y) float64 -99.83 -99.32 -99.79 -99.23
  * time            (time) datetime64[ns] 2014-09-06 2014-09-07 2014-09-08
    reference_time  datetime64[ns] 2014-09-05
    day             (time) int32 6 7 8

和属性不同的是,xarray 会在转换对象时对坐标进行解释并维持坐标变量。xarray中的坐标有两种类型:

  • 维度坐标 是名称和唯一的维度名称相同的1D数组(打印Dataset或 DataArray时 *号标记的变量)。用于基于标签的索引和对齐操作,就像 pandas 中的 DataFrame 和 Series 的索引。事实上这些维度坐标内部使用的是 pandas.Index 存储其值。
  • 非维度坐标 是包含坐标数据的变量,但不是维度坐标。它们可以是多维的,而且非维度坐标名称和它的维度名称没有关系。非维度坐标在绘图或索引时非常有用。除此之外, xarray 不会限制使用与其相关的值。它们不需要进行对齐或自动索引,也不需要在计算时进行匹配。

注:

xarray 中的术语和 CF 中的术语不同。CF中的维度坐标称作坐标变量,而非维度坐标称作辅助坐标变量 [注1]。CF是指 Climate and Forecast [注2]

更改坐标

如果要完整的添加或移除坐标数组,你可以使用类字典语法(如上所示)。

如果要在数据和坐标之间反复转换,可以使用 set_coords 和 reset_coords 方法(均直接返回新对象)。

转换非维度坐标变量为数据变量:

代码语言:javascript
复制
>> ds.reset_coords()
<xarray.Dataset>
Dimensions:         (time: 3, x: 2, y: 2)
Coordinates:
  * time            (time) datetime64[ns] 2014-09-06 2014-09-07 2014-09-08
Dimensions without coordinates: x, y
Data variables:
    temperature     (x, y, time) float64 24.24 12.34 8.215 26.03 25.4 21.89 ...
    precipitation   (x, y, time) float64 9.558 4.379 0.302 9.394 4.124 1.06 ...
    lat             (x, y) float64 42.25 42.21 42.63 42.59
    lon             (x, y) float64 -99.83 -99.32 -99.79 -99.23
    reference_time  datetime64[ns] 2014-09-05
    day             (time) int32 6 7 8

注意:除了维度坐标变量之外,其余的非维度坐标变量均转换为坐标变量。

转换数据变量为坐标变量:

代码语言:javascript
复制
>> ds.set_coords(['temperature', 'precipitation'])
<xarray.Dataset>
Dimensions:         (time: 3, x: 2, y: 2)
Coordinates:
    temperature     (x, y, time) float64 24.24 12.34 8.215 26.03 25.4 21.89 ...
    precipitation   (x, y, time) float64 9.558 4.379 0.302 9.394 4.124 1.06 ...
    lat             (x, y) float64 42.25 42.21 42.63 42.59
    lon             (x, y) float64 -99.83 -99.32 -99.79 -99.23
  * time            (time) datetime64[ns] 2014-09-06 2014-09-07 2014-09-08
    reference_time  datetime64[ns] 2014-09-05
    day             (time) int32 6 7 8
Dimensions without coordinates: x, y
Data variables:
    *empty*

转换后并删除其余变量,返回的新对象仅包含了 temperature 变量和 time 坐标变量:

代码语言:javascript
复制
>> ds['temperature'].reset_coords(drop=True)
<xarray.DataArray 'temperature' (x: 2, y: 2, time: 3)>
array([[[ 24.243747,  12.342479,   8.214643],
        [ 26.02749 ,  25.404077,  21.892622]],

       [[  5.357696,   8.754152,   5.254765],
        [  8.359619,  17.393205,  32.886064]]])
Coordinates:
  * time     (time) datetime64[ns] 2014-09-06 2014-09-07 2014-09-08
Dimensions without coordinates: x, y

坐标方法

坐标(Coordinates)对象也有一些非常有用的方法,比如将其转换为 Dataset:

代码语言:javascript
复制
>> ds.coords.to_dataset()
<xarray.Dataset>
Dimensions:         (time: 3, x: 2, y: 2)
Coordinates:
  * time            (time) datetime64[ns] 2014-09-06 2014-09-07 2014-09-08
    lon             (x, y) float64 -99.83 -99.32 -99.79 -99.23
    reference_time  datetime64[ns] 2014-09-05
    day             (time) int32 6 7 8
    lat             (x, y) float64 42.25 42.21 42.63 42.59
Dimensions without coordinates: x, y
Data variables:
    *empty*

merge 方法也非常有趣,因为它使用了和算数操作中合并坐标的相同逻辑。

代码语言:javascript
复制
>> alt = xr.Dataset(coords={'z': [10], 'lat': 0, 'lon': 0})
>> alt
<xarray.Dataset>
Dimensions:  (z: 1)
Coordinates:
  * z        (z) int32 10
    lon      int32 0
    lat      int32 0
Data variables:
    *empty*

>> ds.coords.merge(alt.coords)
<xarray.Dataset>
Dimensions:         (time: 3, z: 1)
Coordinates:
  * time            (time) datetime64[ns] 2014-09-06 2014-09-07 2014-09-08
    reference_time  datetime64[ns] 2014-09-05
    day             (time) int32 6 7 8
  * z               (z) int32 10
Data variables:
    *empty*

注意:合并之后就有了两个维度坐标变量。

如果你想对 xarray 对象进行二元操作时, coords.merge 方法就显得非常有用了。

索引

使用 .to_index 方法可以将坐标转换为 pandas.Index:

代码语言:javascript
复制
>> ds['time'].to_index()
DatetimeIndex(['2014-09-06', '2014-09-07', '2014-09-08'], dtype='datetime64[ns]', name='time', freq='D')

懒人用法(Dataset 和 DataArray 均可):

代码语言:javascript
复制
>> ds.indexes
time: DatetimeIndex(['2014-09-06', '2014-09-07', '2014-09-08'], dtype='datetime64[ns]', name='time', freq='D')

注意: index 的对象只能是1D变量。当对 lon 或 lat 进行 index 操作时会报错。

MultiIndex 坐标

xarray 支持使用 pandas.MultiIndex 标记坐标值:

代码语言:javascript
复制
>> midx = pd.MultiIndex.from_arrays([['R', 'R', 'V', 'V'], [.1, .2, .7, .9]], names=('band', 'wn'))
>> midx
MultiIndex(levels=[['R', 'V'], [0.1, 0.2, 0.7, 0.9]],
           labels=[[0, 0, 1, 1], [0, 1, 2, 3]],
           names=['band', 'wn'])

>> mda = xr.DataArray(np.random.rand(4), coords={'spec': midx}, dims='spec')
>> mda
<xarray.DataArray (spec: 4)>
array([ 0.323193,  0.545577,  0.005243,  0.641758])
Coordinates:
  * spec     (spec) MultiIndex
  - band     (spec) object 'R' 'R' 'V' 'V'
  - wn       (spec) float64 0.1 0.2 0.7 0.9

为了方便多索引层直接通过 'virtual' 或 'derived' 坐标获取(打印 Dataset 或 DataArray 时用 - 标记):

说人话:即都可以通过类字典方法或属性的方式获取数据。

代码语言:javascript
复制
>> mda['band']
<xarray.DataArray 'band' (spec: 4)>
array(['R', 'R', 'V', 'V'], dtype=object)
Coordinates:
  * spec     (spec) MultiIndex
  - band     (spec) object 'R' 'R' 'V' 'V'
  - wn       (spec) float64 0.1 0.2 0.7 0.9

>> mda.wn
<xarray.DataArray 'wn' (spec: 4)>
array([ 0.1,  0.2,  0.7,  0.9])
Coordinates:
  * spec     (spec) MultiIndex
  - band     (spec) object 'R' 'R' 'V' 'V'
  - wn       (spec) float64 0.1 0.2 0.7 0.9

有时也可以使用 sel 方法代替使用多索引层索引时 (见 Multi-level indexing [注3]):

和其它坐标不同的是,'virtual' 层坐标是不会存储在 DataArray 和 Dataset 对象的 coords 属性中的,尽管打印时会显示出来。 因此,大部分坐标方法都不能对它应用。也不能用于替换特定层。

因为在 Dataset 和 DataArray 对象中每个多索引层都可以通过 ‘virtual’ 坐标获取,它的名称不能与相同对象的其它层,坐标和数据变量的名称冲突。尽管 xarray 会提供默认值,但是还是推荐明确指定名称。


注1:https://github.com/pydata/xarray/issues/1295

注2:http://cfconventions.org/cf-conventions/v1.6.0/cf-conventions.html#terminology

注3:https://xray.readthedocs.io/en/stable/indexing.html#multi-level-indexing

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档