xarray提供了DataArray和Dataset两种数据结构,见官方文档
一、DataArray
DataArray与np.array相比,提供了一个更加直观的读取数据方式:
- label -- 标签
对于拥有自然维度的数据,如气象等,可以直接将x命名为time,代码可阅读性更强。
import numpy as np
import xarray as xr
data = np.random.rand(4, 3)
locs = ["One", "Two", "Three"]
times = pd.date_range("2000-01-01", periods=4)
foo = xr.DataArray(data, coords=[times, locs], dims=["time", "space"])
这样就定义了一个DataArray对象,形态类似于pd.Dataframe,即每个列、行都有对应的label,或者叫name,相当于Dataframe中的列header和行index。
输出foo如上,可以看到如下:
- 数组大小与data一致——为4x3
- time为行标签,有四个维度
- space为列标签,有三个维度
那在Dataframe中类似的格式如下:
space1 | space2 | space3 | |
time1 | x | x | x |
time2 | x | x | x |
time3 | x | x | x |
time4 | x | x | x |
那么此时如果需要取出数据,则语法如下:
这行代码的意思就是,取出列(space)为"Two"的这一列数据。同样,取出某一行数据也是同样的函数。
如果只查看坐标轴的名称参数,即输出(time1, time2, time3 ……),整体上与dist类似,运行代码:
二、Dataset
Dataset可以理解为多个DataArray的堆积
ds = xr.Dataset(
data_vars={
"a": (("x", "y"), np.ones((3, 3))),
"b": ("t", np.full(4, 1), {"b atrri": "b value"}),
},
coords={
"longtitude":("x",[-1, 0, 1]),
"latitude":("y",[-1, 0, 1]),
"time":("t",["2021-09-01", "2021-09-02", "2021-09-03", "2021-09-04"])
)
这段代码可以简单理解为,创建两个DataArray,分别命名为"a","b",然后组合成一个Dataset
- x,y两个三维的坐标组合表示"a"——(3,3)的数组
- t一个四维的坐标表示"b"——(4,1)的数组
结构上与DataArray一致,data表示数据,coords表示坐标信息,且坐标的维度要与数据的维度相一致
当我们需要取出单个数组时,语法与上文类似
三、sel与isel
sel,全称(select by label)
sel
方法允许你根据标签(labels)来选择数据。这意味着你可以使用维度的标签来选择数据,而不是使用索引。- 它通常用于选择具有明确标签的维度,例如时间、空间或其他具有实际意义的标签。
sel
方法可以处理不连续的选择,即可以选择多个不连续的标签。
对上述数据做出修改
ds = xr.Dataset(
data_vars={
"a": (("x", "y"), np.random.randn(3,3)),
"b": ("t", np.full(4, 1), {"b atrri": "b value"}),
},
coords={
"longtitude":("x",[-1, 0, 1]),
"latitude":("y",[-1, 0, 1]),
"time":("t",["2021-09-01", "2021-09-02", "2021-09-03", "2021-09-04"])
},
)
可以如下取出数据
是不是很怪?按理应该是取第一行,但是实际上却变成了index取出。我们将x输出,可以发现:
x里面的数值竟然是[0, 1, 2]而不是[-1, 0, 1]
isel,全称(Index select by label)
网上列举的特点如下:
isel
方法允许你根据整数索引(integer locations)来选择数据。这意味着你需要使用维度的索引位置来选择数据,而不是使用标签。- 它通常用于选择连续的数据块,或者当你需要选择数据的特定位置时。
isel
方法只能处理连续的选择,不能选择不连续的索引。
对于同样的语法,改用isel后发现其实是可以非连续取出数据的