计算 xarray 数据集的平方根误差
Calculate Root Squared Error of xarray dataset
我有 1 月份的 xarray 数据集 monthly_data,其中包含以下信息:
lat: float64 (192)
lon: float64 (288)
time: object (1200)(monthly data)
Data Variables:
tas: (time, lat, lon)[[[45,78,...],...]...]
我有真实值 grnd_trth,其中包含一月份的真实数据
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( ) 函数时,它只会 return 我 tas 值数组!
就以更 'efficient' 的方式执行此操作而言,有两点需要指出。
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 中提取值,您将丢失有关该数组的所有元数据!所以这不是真正的最佳做法,但现在我认为这可以回答您的问题?
我有 1 月份的 xarray 数据集 monthly_data,其中包含以下信息:
lat: float64 (192)
lon: float64 (288)
time: object (1200)(monthly data)
Data Variables:
tas: (time, lat, lon)[[[45,78,...],...]...]
我有真实值 grnd_trth,其中包含一月份的真实数据
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( ) 函数时,它只会 return 我 tas 值数组!
就以更 'efficient' 的方式执行此操作而言,有两点需要指出。
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 中提取值,您将丢失有关该数组的所有元数据!所以这不是真正的最佳做法,但现在我认为这可以回答您的问题?