【问题标题】:Calculate Root Squared Error of xarray dataset计算 xarray 数据集的平方根误差
【发布时间】:2020-07-02 23:07:20
【问题描述】:

我有一月份的 xarray 数据集 monthly_data 包含以下信息:

lat: float64 (192)
lon: float64 (288)
time: object (1200)(monthly data)

Data Variables:
tas: (time, lat, lon)[[[45,78,...],...]...]

我有地面真值 grnd_trth,它有 1 月份的真实数据

Coordinates:
lat: float64 (192)
lon: float64 (288)

Data Variables:
tas(lat and lon)

现在我想从 monthly_data 相对于 grnd_trth 计算每个月的平方根误差,我尝试使用循环,我想它工作正常,这是我的尝试:

rms = []

for i in range(1200):
  err = 0
  for j in (grnd_trth.tas[0] - monthly_data.tas[i]).values:
    for k in j:
      err += k**2
  rms.append(err**1/2)

我只是想知道是否有更有效的方法或任何直接功能可以做到这一点?

编辑:

monthly_data.tas的输出:

xarray.Datarray 'tas': (time:1200 lat: 192 lon: 288)
array([[[45,46,45,4....],....]...]

Coordinates:
lat:
array([-90. , -89.75,...])

lon:
array([0., 1.25.,.... ])

time:
array([cftime.DatetimeNoLeap(0001-01-15 12:00:00),
       cftime.DatetimeNoLeap(0002-01-15 12:00:00),
       cftime.DatetimeNoLeap(0003-01-15 12:00:00), ...,
       cftime.DatetimeNoLeap(1198-01-15 12:00:00),
       cftime.DatetimeNoLeap(1199-01-15 12:00:00),
       cftime.DatetimeNoLeap(1200-01-15 12:00:00)]

grnd_trth.tas的输出:

xarray.Datarray 'tas': (lat: 192 lon: 288)
array([[45,46,45,4....],....]

Coordinates:
lat:
array([-90. , -89.75,...])

lon:
array([0., 1.25.,.... ])

time:
array([cftime.DatetimeNoLeap(0001-01-15 12:00:00)]

但是当我只使用 .values() 函数时,它只会返回我的 tas 值数组!

【问题讨论】:

  • 打印monthly_data.zg 和grnd_truth.zg 时最好看看输出是什么:这有助于建立一个最小的可重现示例。
  • 请检查更新的问题!
  • 不错!这样可以更容易地查看问题可能出在哪里。想想你的索引; monthly_data.tas 具有 (1200,192,288) 的形状,所以像 monthly_data.tas[0] 这样的索引实际上没有意义,对吧?我觉得应该更像:monthly_data.tas[0, :, :].

标签: python python-3.x dataset python-xarray


【解决方案1】:

就以更“高效”的方式执行此操作而言,有两点需要指出。

1) 您可以直接对 xarray 对象进行算术运算,例如。

for time_idx in range(1200):
    # For each time idx, find the root squared error at 
    # each pixel between grnd_truth and monthly_data

    err2 = (grnd_truth.tas - monthly_data.tas[time_idx,...])**2
    err  = err2**(1/2)

2) 有一个方法调用 .sum() 对数组中的所有元素求和,因此这意味着您不必为了对像素求和而执行 for k in j: 行。例如。

rms=[]

for time_idx in range(2000):
    # same two lines as before...

    # sum over every pixel and extract the value from the DataArray
    err_tot = err.sum().values

    # Add to running total
    rms.append(err_tot)

现在,需要指出的一件事是,通过简单地从 DataArray 中提取值,您将丢失有关该数组的所有元数据!所以这并不是真正的最佳实践,但现在我认为这回答了你的问题?

【讨论】:

  • 是的,这看起来更有效!感谢您的帮助:)
猜你喜欢
  • 2022-06-27
  • 2016-04-15
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多