irpas技术客

xarray学习(一)Data Structures_Junewang0614_xarray

大大的周 8215

目录 数据结构DataArray打开或创建DataArray的构造函数Coordinates的指定方式 key properties 关键属性DataArray Coordinates DataSet创建或打开DatasetDataArray的构造函数其他方式 Dataset contents类似于dict的操作方法更新dataset其他 类似于其他object的操作方法对于删除对于更新修改变量名字 Coordinates(未完)types坐标方法 最近需要处理一些大气数据集,有些数据集来自于卫星数据,文件格式很复杂。数据量也很庞大,一起负责项目的同学推荐了xarray库,学习一下以便更有效得整理和利用数据集。

所有内容的学习都是基于xarray提供的官方文档,计划过一遍User Guide。全英对自己来说还是有些困难,因此利用博客将自己学习中的想法记录下来。不得不说越学习越觉得官方文档真的是学习了解的第一手资料,也感受到自身英语方面的局限性。

数据结构

官方文档

介绍了xarray中两种基本的数据结构,DataArray和Dataset

在理解两种数据结构的同时,coordinate(坐标?)也是该库中一个重要概念。

DataArray 打开或创建 DataArray的构造函数

参数

data:一个多维的值数组(numpy ndarray, Series, DataFrame或pandas.Panel)coords:坐标的列表或字典 (坐标名,具体数值)dims:一个维度名称列表,如果coords直接放入的list没有名字,则会用dims提供的名字attrs:要添加到实例的属性字典name:为实例起的名字

eg:

# 一个shape为[4,3]的多维数据组 data = np.random.rand(4, 3) # 两个维度值列表 locs = ["IA", "IL", "IN"] times = pd.date_range("2000-01-01", periods=4) # dims 为两个维度定义了名字 # 构造DataArray foo = xr.DataArray(data, coords=[times, locs], dims=["time", "space"])

输出:

Coordinates的指定方式 长度等于维数的值的列表(例如上面例子所示,coors是一个len==2的list,dims的len==2) 列表中每个值必须为一下格式之一: DataArray or Variable(dims,data[,attrs]) 形式的元组:coords=[(“time”, times), (“space”, locs)])可以转换成DataArray的pandas对象或者标量值(例子中的times)一维数组或列表(如例子所示,普通list就可以) dictionary,字典的形式,此时dims必须有指定值才可以 {coord_name: coord}foo = xr.DataArray(data,coords={ "time": times, "space": locs, "const": 42, "ranking": ("space", [1, 2, 3]), }, dims=["time", "ranking"]) 输出: 利用pandas的数据类型构造DataArray的时候,没有指定的参数会根据pandas进行自动对应 eg: pandas 格式为: df = pd.DataFrame( {"x": [0, 1], "y": [2, 3]}, index=["a", "b"] ) df.index.name = "abc" df.columns.name = "xyz" 转换成DataArray:

构造参数中必要的只有data,其他的参数都有一定的默认值,只提供data将根据默认值自动创建。 使用字典的形式指定coords时,此时dims必须有指定值才可以

key properties 关键属性 values: 该dataArray中实际的数值内容,tuple类型dims: 每个轴的维度名称,tuple类型coords:attrs:字典保存任意元数据 DataArray Coordinates

一种类似于字典dict的数据结构,保存数据一些轴的信息,注意,Coordinates中value部分的数据类型也是DataArray

访问 # coords中利用名称索引 foo.coords['times'] # 直接通过DataArray来访问 foo['times'] # 两种方式都可以 删除,del # 删除 del foo['ranking'] DataSet

是一个类似字典的容器,包含有标记的数组(DataArray对象),其维度是对齐的。 类似于pandas中的DataFrame

创建或打开Dataset DataArray的构造函数

构造实例:

temp = 15 + 8 * np.random.randn(2,2, 3) precip = 10 * np.random.rand(2,2, 3) # coords lon = [[-99.83, -99.32], [-99.79, -99.23]] lat = [[42.25, 42.21], [42.63, 42.59]] ds = xr.Dataset( data_vars = { "temperature": (["x", "y", "time"], temp), "precipitation": (["x", "y", "time"], precip), }, coords={ "lon": (["x", "y"], lon), "lat": (["x", "y"], lat), "time": pd.date_range("2014-09-06", periods=3), "reference_time": pd.Timestamp("2014-09-05"), }, )

输出结果:

构造函数的参数:

data_vars: 是一个字典,key是变量的名称,value是DataArray,或者能转换成dataArray的coords:是一个与数据变量形式相同的字典。attrs:一个字典

上述例子转换成pandas为: 通过此我们可以理解为,coordinate保存的是所有的轴的信息以及其具体数据(lat,lon,times),真实数据在这些轴上产生,而dims信息则是上述轴的索引,借dims我们可以在coordinates数据中,定位到具体的轴的信息。 比如dim组成为 (x,y,time) = (0,0,2014-09-06),对应的coordinates中的数据应该为

lon取(x,y)的值 -> lon.values[0][0] = -99.83, lat同样time取(time)-> 2014-09-06 其他方式 从pandas.DataFrame创建(Dataset.from_dataframe)从netCDF中创建(open_dataset()) Dataset contents 获取不同变量,返回DataArray类型 ds["temperature"] ds.temperature 获取不同属性 # 数据属性 ds.data_vars # 坐标属性 ds.coords # 元数据属性 ds.attrs 类似于dict的操作方法

对于dataset的某些操作,可以类似于操作python字典一样进行操作

更新dataset # 实例化空dataset ds = xr.Dataset() # 为dataset的data_vars赋值 ds["temperature"] = (("x", "y", "time"), temp) ds["temperature_double"] = (("x", "y", "time"), temp * 2) ds["precipitation"] = (("x", "y", "time"), precip) # 为coords赋值 ds.coords["lat"] = (("x", "y"), lat) ds.coords["lon"] = (("x", "y"), lon) ds.coords["time"] = pd.date_range("2014-09-06", periods=3) ds.coords["reference_time"] = pd.Timestamp("2014-09-05") 其他

可以使用所有的标准dict方法

valuesitemsdelitemget浅拷贝 .copy() ; 深拷贝 .copy(deep=True) 类似于其他object的操作方法

xarray中还可以通过其他object方法(如pandas)等来操作Dataset

对于删除 drop_vars() 删除数据变量,会将删除的数据变量作为返回对象drop_dims() 删除维度变量,使用该维度的变量都会被删除 对于更新 assign(),用于操作、生成新的数据变量,并将新的数据变量作为返回值 ds.assign(temperature2=2 * ds.temperature) assign_coords(),用于操作、生成新的坐标,并将新的坐标变量作为返回值pipe(),操作数据的方法 修改变量名字 修改数据变量名,rename() # 字典格式:key:old_name,value"new_name ds.rename({"temperature": "temp", "precipitation": "precip"}) 修改dim维度索引变量名,swap_dims() ds.coords["day"] = ("time", [6, 7, 8]) # 此时应该有两个坐标变量使用time作为其dim的索引变量,time和day # 字典格式:key:old_name,value"new_name ds.swap_dims({"time": "day"})

索引为time的地方都修改了

Coordinates(未完)

坐标变量,用于辅助DataArray和Dataset存储数据

types dimension coordinates 维坐标

pandas.index

non-dimension coordinates 非维坐标

是包含坐标数据但不是维度坐标的变量。

坐标方法 ds.coords.to_dataset()

将coords转为dataset格式,coords在新的dataset中还是坐标变量

coords.mergeto_index()

将坐标(或任何DataArray)转换为实际的pandas.Index


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #xarray #学习数据结构