Python 3.x: calcula la salida o anomalía de un valor entre dos matrices de diferentes tamaños de cuadrícula geográfica

CorePress2023-11-30  1

Tengo una pregunta técnica que intenté resolver durante toda la semana. Creé un archivo netcdf a partir de observaciones con un valor de medición de la calidad del aire en una cuadrícula geográfica (lat/lon) a lo largo de una ruta determinada. Ahora me gustaría calcular la desviación (o anomalía) de estos valores a partir de una cuadrícula más grande (datos de un modelo de computadora con valores medios en un área grande).

Mis dos archivos netcdf están estructurados de la siguiente manera:

Observaciones (Medidas del instrumento):

Dimensiones:

lat: 1321, lon: 1321

Variables de datos:

Longitude (lon) float64 8.413 8.411 8.409 ... 4.904 4.905
Latitude (lat) float64 47.4 47.4 47.41 ... 52.37 52.37
obs_data (lat, lon) float64 ...

Datos del modelo:

Dimensiones:

latitude: 140, level: 1, longitude: 215, time: 24

Coordenadas:

longitude  (longitude)  float32    357.55 357.65 ... 18.85 18.95 
latitude   (latitude)   float32    55.95 55.85 55.75 ... 42.15 42.05    
level      (level)      float32    0.0
time       (time)    timedelta64[ns]    00:00:00 01:00:00 ... 23:00:00

Variables de datos:

model_data (time, level, latitude, longitude) float32 ...

Probé todo tipo de enfoques diferentes, pero cada vez me encuentro con algún tipo de error por el cualh parece que no hay solución y terminé teniendo que probar un enfoque diferente. Lo más cerca que estuve fue siguiendo este gran tutorial, pero también aquí choqué contra un muro. Cuando trato de encontrar la latitud y la longitud más cercanas para los dos conjuntos de datos, mediante

lat_idx = np.abs(model_lat - obs_lat).argmin() #subtract train lat from model lat
lon_idx = np.abs(model_lon - obs_lon).argmin() #subtract train lon from model lon

Recibo el siguiente error

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-437-9396b00ba22f> in <module>
     18 
     19 # Find the nearest latitude and longitude for the train data
---> 20 lat_idx = np.abs(model_lat - obs_lat).argmin()
     21 lon_idx = np.abs(model_lon - obs_lon).argmin()
     22 

~/opt/anaconda3/lib/python3.7/site-packages/numpy/ma/core.py in __sub__(self, other)
   4115         if self._delegate_binop(other):
   4116             return NotImplemented
-> 4117         return subtract(self, other)
   4118 
   4119     def __rsub__(self, other):

~/opt/anaconda3/lib/python3.7/site-packages/numpy/ma/core.py in __call__(self, a, b, *args, **kwargs)
   1024         with np.errstate():
   1025             np.seterr(divide='ignore', invalid='ignore')
-> 1026             result = self.f(da, db, *args, **kwargs)
   1027         # Get the mask for the result
   1028         (ma, mb) = (getmask(a), getmask(b))

ValueError: operands could not be broadcast together with shapes (140,) (1321,)

¿No hay una manera de calcular simplemente:

anomaly = model_data[lat, lon] - obs_data[lat, lon]

?

Mi nueva esperanza es xarray, pero realmente tengo problemas con su documentación y he pasado días buscando una manera de avanzar.

¿Alguno de ustedes ha encontrado una solución a este problema? Cualquier consejo es realmente apreciado.

Editar:

Según lo solicitado por V. Ayrat:

In: type(model_data)
Out: xarray.core.dataset.Dataset

obs_data es del mismo tipo.

Si dos valores de obs_data caen en la misma celda de model_data, los obs_data deben restarse de la misma ce model_datall.

  • ¿Qué es el tipo (model_data)? Entonces tienes una cuadrícula llena de valores e intentas restar tus observaciones de estos valores. ¿Qué debería pasar si 2 observaciones caen en la misma celda de la cuadrícula model_data? -V. Ayrat 8 de junio de 2020 a las 0:05
  • No está claro cuáles son las estructuras de datos queutilizar para cada uno de sus conjuntos de datos. ¿Son numerosos conjuntos o pandas? Un pequeño ejemplo de muestra y el resultado deseado nos ayudarán a resolver mejor el problema. -Ehsan 8 de junio de 2020 a las 2:59
  • Gracias V. Ayrat y Ehsan. He editado la publicación. -pwi 8 de junio de 2020 a las 7:19


------------------------

No está del todo claro qué intenta hacer ni qué estructuras de datos utiliza. Editaré la publicación si hay más información más adelante. Sin embargo, creo que esto resuelve el problema:

Si desea la latitud/longitud más cercana de obs_lat a model_lat, utilice:

lat_idx = np.abs(model_lat - obs_lat[:,None]).argmin(axis=0)
lon_idx = np.abs(model_lon - obs_lon[:,None]).argmin(axis=0)

Y si quieres la latitud/lon más cercana de model_lat a obs_lat usa:

lat_idx = np.abs(model_lat - obs_lat[:,None]).argmin(axis=1)
lon_idx = np.abs(model_lon - obs_lon[:,None]).argmin(axis=1)
1
  • 1 ¡Gracias Ehsan! Esto funciona para el error descrito. Ahora estoy un paso más cerca del objetivo final.-la espada 8 de junio de 2020 a las 7:21 am
Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare