xarray.apply_ufunc()用法示例

简单示例

首先我们需要定义一个函数,这个函数接收一个序列,然后返回三个常数:

def foo(lst)->float:
    #接收一个一维序列,然后求解线性回归系数、R值、P值
    res = stats.linregress(x=range(len(sample)), y=sample)
    return res.slope, res.rvalue, res.pvalue

我们需要把一个普通py函数推广到xarray矩阵中,这里需要注意几个细节:

  1. 如果这个函数的输入为一个序列,要指明沿哪个维度输入,比如: input_core_dims=[["z"]]
  2. 指明输出的维度,如本文中的函数输出三个函数,就要指明:output_core_dims=[(),(),()]
  3. 向量化参数设置为真:vectorize=True ,只有输出的返回值仅有一个常数时,才可以忽略此参数。
import xarray as xr
import numpy as np

# 定义你的dataarray对象
da = xr.DataArray(np.random.rand(5, 5, 3), coords={"x": [1, 2, 3, 4, 5,], "y": [1, 2, 3, 4, 5,], "z": [1, 2, 3]})

# 定义你的函数
def foo(lst)->float:
    #接收一个一维序列,然后求解线性回归系数、R值、P值
    res = stats.linregress(x=range(len(sample)), y=sample)
    return res.slope, res.rvalue, res.pvalue


# 使用xarray.apply_ufunc函数
result = xr.apply_ufunc(foo, da, input_core_dims=[["z"]], output_core_dims=[(),(),()], vectorize=True, dask="allowed")

# 查看结果
print(result)

可以看到,生成了3个DataArray对象:

<xarray.DataArray (x: 5, y: 5)>
 array([[0.01218603, 0.01218603, 0.01218603, 0.01218603, 0.01218603],
        [0.01218603, 0.01218603, 0.01218603, 0.01218603, 0.01218603],
        [0.01218603, 0.01218603, 0.01218603, 0.01218603, 0.01218603],
        [0.01218603, 0.01218603, 0.01218603, 0.01218603, 0.01218603],
        [0.01218603, 0.01218603, 0.01218603, 0.01218603, 0.01218603]])
 Coordinates:
   * x        (x) int64 1 2 3 4 5
   * y        (y) int64 1 2 3 4 5,
 <xarray.DataArray (x: 5, y: 5)>
 array([[0.36905434, 0.36905434, 0.36905434, 0.36905434, 0.36905434],
        [0.36905434, 0.36905434, 0.36905434, 0.36905434, 0.36905434],
        [0.36905434, 0.36905434, 0.36905434, 0.36905434, 0.36905434],
        [0.36905434, 0.36905434, 0.36905434, 0.36905434, 0.36905434],
        [0.36905434, 0.36905434, 0.36905434, 0.36905434, 0.36905434]])
 Coordinates:
   * x        (x) int64 1 2 3 4 5
   * y        (y) int64 1 2 3 4 5,
 <xarray.DataArray (x: 5, y: 5)>
 array([[0.00131352, 0.00131352, 0.00131352, 0.00131352, 0.00131352],
        [0.00131352, 0.00131352, 0.00131352, 0.00131352, 0.00131352],
        [0.00131352, 0.00131352, 0.00131352, 0.00131352, 0.00131352],
        [0.00131352, 0.00131352, 0.00131352, 0.00131352, 0.00131352],
        [0.00131352, 0.00131352, 0.00131352, 0.00131352, 0.00131352]])
 Coordinates:
   * x        (x) int64 1 2 3 4 5
   * y        (y) int64 1 2 3 4 5

复杂示例

现在让他应用于dataset:

import xarray as xr
import numpy as np
from scipy import stats


ds=xr.Dataset(data_vars=dict(
         var1=(["x", "y", "time"],np.random.rand(5, 5, 3)),
         var2=(["x", "y", "time"],np.random.rand(5, 5, 3)),
 ),coords={"x": [1, 2, 3, 4, 5,], "y": [1, 2, 3, 4, 5,], "time": [1, 2, 3]})

def linregress(da,dim):

 # 定义你的函数
 def foo(sample)->float:
     #接收一个一维序列,经过处理后输出一个整数
     
     print(sample)
     res = stats.linregress(x=range(len(sample)), y=sample)
     return res.slope, res.rvalue, res.pvalue


 # 使用xarray.apply_ufunc函数
 result = xr.apply_ufunc(foo, da, input_core_dims=[[dim]], output_core_dims=[(),(),()], vectorize=True)

 return result
 
#查看结果
res=linregress(ds,dim="time")
print(res)

输出为:

(<xarray.Dataset>
 Dimensions:  (x: 5, y: 5)
 Coordinates:
   * x        (x) int64 1 2 3 4 5
   * y        (y) int64 1 2 3 4 5
 Data variables:
     var1     (x, y) float64 -0.09859 0.1949 -0.3086 ... 0.2483 0.1627 -0.02292
     var2     (x, y) float64 -0.3107 -0.3781 -0.04227 ... -0.2307 0.05446 -0.273,
 <xarray.Dataset>
 Dimensions:  (x: 5, y: 5)
 Coordinates:
   * x        (x) int64 1 2 3 4 5
   * y        (y) int64 1 2 3 4 5
 Data variables:
     var1     (x, y) float64 -0.42 0.7406 -0.7166 ... 0.5737 0.7468 -0.2498
     var2     (x, y) float64 -0.9122 -0.9307 -0.7619 ... -0.9814 0.2078 -0.8954,
 <xarray.Dataset>
 Dimensions:  (x: 5, y: 5)
 Coordinates:
   * x        (x) int64 1 2 3 4 5
   * y        (y) int64 1 2 3 4 5
 Data variables:
     var1     (x, y) float64 0.724 0.4691 0.4914 0.3615 ... 0.611 0.4632 0.8393
     var2     (x, y) float64 0.2688 0.2383 0.4485 0.8178 ... 0.1229 0.8667 0.2937)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高堂明镜悲白发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值