Calcular raíz cuadrada de error del conjunto de datos Xarray

Shalin Barot:

Tengo Xarray conjunto de datos monthly_data de enero de simplemente con los siguientes datos:

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

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

He tierra valor de verdad grnd_trth que tiene verdaderos datos del mes de enero

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

Data Variables:
tas(lat and lon)

Ahora quiero calcular la raíz cuadrada de error para cada mes de monthly_data con respecto al grnd_trth , He intentado utilizar bucles y supongo que está funcionando bien, aquí está mi intento:

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)

Sólo quiero saber es que hay manera más eficiente o cualquier función directa de hacerlo?

Editar:

Salida del 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)]

Salida del 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)]

Pero cuando sólo tiene que utilizar .values ​​() la función que va a volver solamente me TAS matriz de valores!

AWilliams3142:

En términos de hacer esto de una manera más 'eficiente', hay dos cosas que señalar.

1) Se le permite hacer operaciones aritméticas directamente en Xarray objetos por ejemplo.

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) Hay una llamada a un método .sum()que resume todos los elementos de una matriz, por lo que esto significa que no tendrá que hacer la for k in j:línea con el fin de resumir lo largo de los píxeles. P.ej.

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)

Ahora, una cosa a señalar aquí es que, simplemente extraer los valores de la DataArray, se pierde todos los metadatos acerca de la gama! Así que esto no es realmente la mejor práctica, pero por ahora creo que esto responda a su pregunta?

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=351532&siteId=1
Recomendado
Clasificación