es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo alinear un DataArray de xarray con una dimensión de longitud 1 con una matriz más grande?

Me gustaría tomar un conjunto de datos de xarray con una dimensión de tiempo de 1 y simplemente replicar los datos para aumentar la dimensión del tiempo de 1 a N. ¿Cuál es la forma más eficiente de hacer esto? He intentado varios métodos como expand_dims y stack, pero ninguno de ellos parece hacer lo que quiero.

En última instancia, quiero poder hacer
moc10_H11 – moc_ctrl_clim
Donde el resultado tendría las mismas dimensiones que moc10_H11 (35). En este momento, cuando hago esto, la dimensión de tiempo de la salida es solo 1.

Para mayor claridad, moc_ctrl_clim es:

xarray.Dataset
Dimensiones:
tiempo: 1, lat_aux_grid: 395, moc_z: 61
Coordenadas: tiempo (tiempo) objeto 0001-01-01 00:00:00
lat_aux_grid (lat_aux_grid) float32 -79.49 -78.95 -78.42 … 89.47 90.0
moc_z (moc_z) float32 0.0 1e+03 … 5.25e+05 5.5e+05
Variables de datos:
MOC (tiempo, moc_z, lat_aux_grid) float64
dask.array<chunksize=(1, 61, 395), meta=np.ndarray>

y moc10_H11 tiene:

xarray.Dataset
Dimensiones:
tiempo: 35, lat_aux_grid: 395, moc_z: 61
Coordenadas: tiempo (tiempo) objeto 0001-01-01 00:00:00
lat_aux_grid (lat_aux_grid) float32 -79.49 -78.95 -78.42 … 89.47 90.0
moc_z (moc_z) float32 0.0 1e+03 … 5.25e+05 5.5e+05
Variables de datos:
MOC (tiempo, moc_z, lat_aux_grid) float64
dask.array<chunksize=(1, 61, 395), meta=np.ndarray>

Tags:  

Answer

  1. Avatar for davy.ai

    La manera más eficiente de aumentar la dimensión de tiempo de 1 a N en xarray es mediante el método “broadcast_like”.

    Suponiendo que se tiene un conjunto de datos xarray “ds” con una dimensión de tiempo de 1, donde N es la longitud deseada de la dimensión de tiempo, el siguiente código replicará los datos a lo largo de la dimensión de tiempo para crear un nuevo conjunto de datos “new_ds” con una dimensión de tiempo de longitud N:

    import xarray as xr
    
    new_ds = ds.broadcast_like(xr.zeros_like(ds)*xr.DataArray(range(N), dims='time'))
    

    Este código primero crea un DataArray de ceros con la dimensión “time” igual a N, y luego lo transmite a la misma forma que el conjunto de datos original “ds”, con las mismas dimensiones excepto para la dimensión de tiempo. Los datos en “ds” se replican a lo largo de la nueva dimensión de tiempo de longitud N para crear “new_ds”.

    Después de esta replicación, debería ser posible realizar la operación “moc10_H11 – moc_ctrl_clim” y obtener un resultado con las mismas dimensiones que “moc10_H11”.

Comments are closed.