相关文章推荐
想旅行的大蒜  ·  SQL编程之高级查询及注意事项-PingCA ...·  11 月前    · 
爱搭讪的蚂蚁  ·  centos7.6编写自己的启动服务,运行s ...·  1 年前    · 
体贴的路灯  ·  Order a subquery in ...·  2 年前    · 
有爱心的花卷  ·  Linux基础——正则表达式-腾讯云开发者社 ...·  2 年前    · 
眉毛粗的豆浆  ·  周鸿祎发出360人工智能总动员令 - 知乎·  2 年前    · 
Code  ›  python--xarray介绍2_python xarray_简朴-ocean的博客
维度 空间维度
https://blog.csdn.net/weixin_44237337/article/details/120211050
干练的西红柿
2 年前
  • **xarray介绍2**
    • **xarray.align**
    • **xarray --降维处理**
    • **xarray--分割数据**(以nc文件为例)
      • xarray.DataArray.groupby()求季节平均、年平均、月平均
      • 对于按月分组元素的迭代
      • 分组元素的逐个访问
      • 查找各个分组中对应元素在原始数据中键的位置
      • xarray--分箱(按照不同区间对数据进行分组)
        • 1、筛选数据groupby
        • 2、应用数据Apply
        • 3、具体绘图实操
      • xarray--重采样
      • xarray--时间窗移动
      • xarray--线性多项式回归

      给定任意数量的 Dataset 和/或 DataArray 对象,返回新的 具有对齐索引和尺寸大小的对象。

      举个例子:

      x = xr.DataArray(    [[25, 35], [10, 24]],    
      		dims=("lat", "lon"),    
      		coords={"lat": [35.0, 40.0], "lon": [100.0, 120.0]},)
      y = xr.DataArray(    [[20, 5], [7, 13]],    
      		dims=("lat", "lon"),    
      		coords={"lat": [35.0, 42.0], "lon": [100.0, 120.0]},)
      

      首先创建两个dataArray:

      默认返回join='inner’的对齐方式,提取两者变量索引交集的数据。:

      a, b = xr.align(x, y)
      

      对比x、y可以发现,两者索引交集为lat=35,lon=100、120,

      所以a就是x中lat=35,lon=100、120对应的值,b同理

      同样的,可以改变join=‘Method ‘改变提取的结果。

      方法outer:提取两者变量索引并集的数据。

      a, b = xr.align(x, y, join="outer")
      

      可以发现,将x、y的不同的lat对应的数据进行并集,a赋值结果如下

      ​ lon:100 120

      • lat:35 25 35
      • ​ 40 10 24
      • ​ 42 nan nan

      其他方法可以查看官网:

      xarray.align

      xarray --降维处理

      举一个三维SST的例子进行处理示范:

      import xarray as xr
      file='..\\sst_olr\\olr.mon.mean.nc'
      data=xr.open_dataset(file)
      
      data.shape
      

      查看一些维度排列顺序

      可以看到,维度顺序依次是time、lat、lon,对应axis=0、1、2

      如果要对时间方向上以平均的方法进行降维,可写为:

      # 对第0维度(维度time)以平均的方法进行降维
      data.mean(axis = 0)
      

      可用.plot方法可视化结果:

      data.mean(axis=2).plot
      

      同样的道理,如果要对经纬方向上进行降维,只需要将写上对应的维度即可。

      # 对经纬度(维度lat、lon)以平均的方法进行降维
      data.mean(axis=(1, 2))
      

      这其实就得到了一个时间序列,这个时间序列描述了全球平均OLR的变化。

      画个图来看看:

      # 绘制2018-01~2018-12全球平均OLR变化
      data.mean(axis=(1, 2)).sel(time=slice("2018-1","2018-12")).plot()
      

      上述方法是仿照numpy中的降维方法,xarray中可以使用另一种更方便快捷的方法。直接选择需要处理的维度名称,效果与上述方法是一样的,建议大家采取xarray的方法,自动跳过了缺测值(默认),有利于数据处理。

      data.mean(dim="time")data.mean(dim="lat","lon")
      

      此外,如min(取最小值), max(取最大值), sum(求和), std(求标准差)等也可以实现降维,大家可以自己摸索。

      xarray–分割数据(以nc文件为例)

      在分割数据过程中,需要用到groupby()实现对于按季节、按月份的分割等待操作。

      import xarray as xr
      file='D:\\desktopppp\\20210906\\sst_olr\\olr.mon.mean.nc'
      data=xr.open_dataset(file).olr
      

      首先还是导入OLR数据,并提取时间变量,用法前文已经讲过

      data.time
      

      同时,这里的time是datatime的格式,可以直接使用datatime库的相关使用方法创建时间变量的待索引对象,利用.dt.month提取各个时间的月份数据

      data.time.dt.month
      

      同理,利用.dt.year提取各个时间的年份数据

      data.time.dt.year
      

      xarray.DataArray.groupby()求季节平均、年平均、月平均

      类似于Pandas包中的groupby的思想,我们利用dataArray.groupby()函数将月份作为键(唯一值)来对原数据进行分离。本质是即把各年的某个月的数据放到了一组。

      month_group = data.groupby("time.month")
      month_group 
      

      除了可以以月份进行分割数据,也可以将年、季节作为分割对象,大家可以自行尝试

      data.groupby("time.year")
      data.groupby("time.season")
      

      以上操作的优点在于,对于我们经常处理的一些海洋气象nc文件,经常需要对于数据进行求季节平均,月平均,年平均等处理,使dataArray.groupby()

      就可以非常方便快捷的实现处理,以下给出例子:

      season_mean=data.groupby('time.season').mean('time', skipna=True)
      year_mean=data.groupby('time.year').mean('time', skipna=True)
      month_mean=data.groupby('time.montn').mean('time', skipna=True)
      

      对于按月分组元素的迭代

      经过上面的分割操作后,原数据已经拆分成12个组(groups),放置在变量month_group中。对于这12个组,可通过循环进行遍历。迭代器返回各个组的键(组名)和值(与该组相对应的实际数据集)。

      for group_name, group_ds in month_group:    
      # 当第一个循环结束时,停止遍历
      	month_group    
      	print(group_name)    
      	break
      group_ds
      

      分组元素的逐个访问

      通过对数据进行list处理,可以获得分组名称和对应的xarray数据.

      list_group = list(month_group)
      list_group
      

      这样,list_group中有12个DataArray,每个DataArray中对应包含1-12个月的数据

      通过索引可以提取对于月份的数据

      list_group[0]#访问这个分组对应的xarray数据(即各年的一月数据)。
      list_group[1]#(即各年的二月数据)。以此类推
      

      查找各个分组中对应元素在原始数据中键的位置

      对于上述分割的数据,可以通过使用.groups方法获得元素(month)在原分组坐标中(time)的位置

      gb = data.groupby("time.month").groupsgb
      

      其中,第0个可理解为ds.isel(time = 0),同理第12个可理解为ds.isel(time = 12),并且是一个字典类型。字典:键值对(key-value pair)键与值之间的关联。

      可以使用for循环遍历:

      for key in sorted(gb):    # str()函数将数值转为字符串    
      	print( str(key)+"月", gb[key])
      

      xarray–分箱(按照不同区间对数据进行分组)

      1、筛选数据groupby

      对数据进行筛选,按照自己定义的区间。

      使用的数据信息如下:

      为了减少运算时间,先选出第0时刻的数据,创建区间,按照区间进行筛选

      da= data.isel(time = 0)
      sst_bin = [-10, 0, 10, 20, 30]
      gb_bin_list =da.groupby_bins("sst", sst_bin)
      gb_bin_list 
      

      应该有四个区间,检验结果,符合要求

      然后,对于所需区间的数据进行分别处理,索引方法与上述相同。

      2、应用数据Apply

      通过.groupby方法定义了原数组的分组方法,但是并未对原数组进行真正的分割。

      下一步操作便是把相关的计算函数应用(Apply)到这12个分组了,使用的方法是.map(映射)

      以求解多年各月sst平均空间场为例说明其实现过程:

      import xarray as xr
      import numpy as np
      file='...\\sst.mnmean.nc'
      data=xr.open_dataset(file)
      gb = data.groupby("time.month")
      def time_mean(a):    
      	return a.mean(dim="time")
      monthsst = gb.map(time_mean)
      monthsst
      
      monthsst = gb.mean(dim = "time")#直接实现计算
      

      3、具体绘图实操

      下面给出一些绘图操作:

      #绘制lon=180.5,lat=50.5处的数据时间序列
      monthsst.sst.sel(lon=180.5, lat=50.5).plot()
      
      #多年纬度月平均气候场
      monthsst.sst.mean(dim="lon").plot.contourf(x="month", levels=12, vmin=-2, vmax=30)
      

      具体参数设置如下:

      • 绘制等值线图:.plot.contourf;
      • x轴为变量month:x="month";
      • 色标分为12个部分(11个色块):levels=12;
      • 绘制的最大值和最小值为30和-2:vmin=-2, vmax=30.
      #多年2月与7月平均气候场之间的差异
      (monthsst.sst.sel(month=2) - monthsst.sst.sel(month=8)).plot()
      

      xarray–重采样

      import xarray as xr
      import numpy as np
      file='..\\sst.mnmean.nc'
      data=xr.open_dataset(file)
      ds = data.sel(time=slice("1989", "2018")).load()
      resample_obj = ds.resample(time="5Y")
      

      这里.resample(time="5Y")是对如何对时间进行重采样进行设置,维度为time,设置的时间间隔为 5 年。

      需要注意的是:resample 仅能用于正确的日期、时间索引。

      xarray–时间窗移动

      可适用于任意维度,如果将其作用于时间维度,也可称之为滑动平均。

      sst_rolling = ds.sst.rolling(time=12, center = True).mean()
      

      参数time=12指定了对维度time以 12 个月为周期(月数据)变动时间窗,center参数表明以当前窗的两侧筛选数据,否则是以当前窗的前 12 个月作为筛选目标(包括本身)。.mean()表明对每一个 Rolling 对象取平均。

      若时间窗为偶数值,那么对应中心位置将会在平均位置偏右侧,若不指定参数center=True,则采用从当前元素往上筛选的方法,否则采用以当前元素为中心,从两个方向上进行筛选。

      xarray–线性多项式回归

      import xarray as xr
      import numpy as np
      file='..\\sst.mnmean.nc'
      data=xr.open_dataset(file)
      ds = data.sel(time=slice("1989", "2018")).load()ds.sst.polyfit("time", 1, full = True)
      
      #线性趋势(斜率)
      ds.sst.polyfit("time", 1, full = True).polyfit_coefficients.isel(degree = 0).plot()
      

      .polyfit方法实现了回归功能,第一个参数"time"指定拟合坐标为time,第二数字参数指定为一元线性回归,full = True代表回归方法不仅要返回拟合系数(一元回归即斜率和截距)还应当返回残差,矩阵秩和奇异值。

      #截距空间分布
      ds.sst.polyfit("time", 1, full = True).polyfit_coefficients.isel(degree = 1).plot()
                                          本文简单介绍了 xarray 的 DataArray 对象的基本概念和语法,但是我们仅仅触及了其实用性的表面。如果你想更深入了解有关 xarray 和 DataArray 对象的更多信息,请参阅官方文档,并深入学习一下如何使用这个强大的 Python 数据处理库。
                                          Xarray库关于插值的操作内容不多,但是很实用,需要安装scipy库。首先我们还是创建一个DataArray:da = xr.DataArray(np.sin(0.3 * np.arange(12).reshape(4, 3)),[('time', np.arange(4)),('lat', [30, 60, 90])])print(da)##array([[ 0.        ,  0.29...
                                          本文介绍了Python xarray DataArray类的用法,包括如何创建DataArray对象、如何索引和切片DataArray对象、如何进行运算、如何数据对齐等。Python中的xarray库提供了DataArray类,它是一个强大的多维数组数据结构,可以灵活地进行数据分析和计算。本文将详细介绍DataArray类的用法,让您轻松掌握多维数组的操作技巧。这意味着它可以将不同数据对象中的数据自动对齐,因此您可以像处理单个数据对象一样处理它们。DataArray对象可以与numpy数组进行同样的运算。
      dataset = xr . open_dataset (
          "tiledb_array_uri" ,
          backend_kwargs = { "key" : key , "timestamp" : timestamp },
          engine = "tiledb"
      图块数据库
      TileDB-xarray需要当前的xarray开发分支。 要安装TileDB-xarray,请克隆此存储库,然后从克隆的存储库内部运行以下命令: 
      pip install .
       要启用带有xarray的Dask并使用'parallel'附加功能: 
      pip install ' .[parallel] '
                                          xarray介绍
      文章目录**xarray介绍****xr.Dataset:**1、官方例子:2、同一维度上多个变量的坐标参数:xr.DataArray:1、有多个维度时(以3维为例)2、只有一个维度时**xarray--数据的读写**利用xarray读取NetCDF数据:读取nc文件:写入nc文件:**xarray--数据索引和切片**xarray--nc文件规则网格插值
      xr.Dataset:
      装入多个变量的信息,可以对每个变量进行定义不同的维度信息。主要包含以下三部分:
      data_vars
                                          xarray概述创建DataArray索引(Indexing)属性(Attributes)计算(Computation)GroupBy分割(Split)Binning
      以下是可以使用xarray.DataArray对象的事例。更多详细信息可以参阅剩余其他文档。
      首先,导入 numpy, pandas and xarray,并使用他们的缩写:
      In [1]: import numpy as np
                                          1、读取grib2
      ds = xr.open_dataset('xxx.grib2', engine='cfgrib', backend_kwargs={'filter_by_keys':{'typeOfLevel': 'isobaricInhPa'}})
      isobaricInhPa 气压坐标系、垂直坐标系,一般是多层高空数据
      surface是地面数据
      读取会生成.idx文件,读取报错时记得删除.idx文件
       In [ 1 ]: import pint_xarray
         ...: import xarray as xr
      In [ 2 ]: ds = xr . Dataset ({ "a" : ( "x" , [ 0 , 1 , 2 ]), "b" : ( "y" , [ - 3 , 5 , 1 ], { "units" : "m" })})
         ...: ds
      Out [ 2 ]:
      < xarray>
      Dimensions :  ( x : 3 , y : 3 )
      Dimensions without coordinates : x , y
      Data variables :
          a        ( x ) int64 0 1 2
          b        ( y 
      dataarrays 最简单的画图方法就是调用dataarray.plot()
      xarray 可以通过使用坐标名称或者数据名称进行数据索引,如 attrs.long_name, attrs.standard_name, DataArray.name and attrs.units ,而这些名称可以通过dataarray.attrs命令获得,示例如下:
      sst.attrs
      {'long_name': 'Monthly Mean of Sea Surface Temperat
                                          XArray是一种抽象数据类型,类似于一个大的指针数组,它满足了许多与哈希或常规可调整大小数组相同的需求。由于 xarray 中的数据都是指针,使用 RCU 这种无锁的方法查找数据是再合适不过了。xarray 数据结构主要的应用场景是在文件缓存。我们知道在Linux内核中,为了加快文件的访问速度,将空闲的内存页就用做了磁盘的 cache。一个文件的缓存通过 address_space 数据结构进行管理,而这里面用于记录文件数据与内存页之间映射关系的数据结构就是采用了 xarray。
      
 
推荐文章
想旅行的大蒜  ·  SQL编程之高级查询及注意事项-PingCAP | 平凯星辰
11 月前
爱搭讪的蚂蚁  ·  centos7.6编写自己的启动服务,运行systemctl后卡住了的解决方案 - 昵称昵称昵称 - 博客园
1 年前
体贴的路灯  ·  Order a subquery in linq .include portion - CodeProject
2 年前
有爱心的花卷  ·  Linux基础——正则表达式-腾讯云开发者社区-腾讯云
2 年前
眉毛粗的豆浆  ·  周鸿祎发出360人工智能总动员令 - 知乎
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号