14 votes

Xarray combine_by_coords renvoie l'erreur d'index global monotonique

J'essaie de combiner deux ensembles de données spatiales de type xarray à l'aide de combine_by_coords. Ces deux ensembles de données sont constitués de deux tuiles situées l'une à côté de l'autre. Il y a donc des coordonnées qui se chevauchent. Dans les régions de chevauchement, les valeurs des variables de l'un des ensembles de données sont nan.

J'ai utilisé la fonction "combine_by_coords" avec l'option compat='no_conflicts'. Cependant, cela renvoie le indices globaux monotones le long de la dimension y erreur. Il semble que c'était un problème avant mais qu'il a été corrigé ( aquí ). Je ne sais donc pas vraiment pourquoi je reçois cette erreur. Voici un exemple (les tuiles netcdf sont aquí ):

import xarray as xr

print(xr.__version__)
>>>0.15.1

ds1=xr.open_dataset('Tile1.nc')
ds2=xr.open_dataset('Tile2.nc')
ds = xr.combine_by_coords([ds1,ds2], compat='no_conflicts')
>>>...
 ValueError: Resulting object does not have monotonic global indexes along dimension y

Merci

15voto

ThomasNicholas Points 397

Il ne s'agit pas d'un bogue, mais de l'erreur qu'il devrait commettre compte tenu de vos données. Cependant, je vois que la documentation n'est pas très claire quant à la raison pour laquelle cela se produit !

combine_by_coords et combine_nested font deux choses : ils concatènent (en utilisant xr.concat ), et ils fusionnent (en utilisant xr.merge ). merge regroupe des variables de même taille, concat joint des variables de différentes tailles aux extrémités les unes des autres. L'étape de concaténation n'est jamais censée traiter des coordonnées qui se chevauchent partiellement, et l'étape de combine ont donc la même restriction.

Cette erreur est un rejet explicite de l'entrée que vous lui avez donnée : "tu m'as donné des coordonnées qui se chevauchent, je ne sais pas comment les concaténer, je vais donc les rejeter". Normalement, cela a du sens - quand les coordonnées qui se chevauchent ne sont pas des NaNs, il y a une ambiguïté quant aux valeurs à choisir.

Dans votre cas, vous lui demandez d'effectuer une opération bien définie, et la discussion dans la documentation sur la fusion des coordonnées qui se chevauchent aquí implique que compat='no_conflicts' gérerait cette situation. Malheureusement, c'est seulement pour xr.merge pas xr.concat et ne s'applique donc pas à combine_by_coords soit. C'est vraiment déroutant.

Il pourrait être possible de généraliser le combine pour gérer le scénario que vous décrivez (où les parties superposées des coordonnées sont entièrement spécifiées par les valeurs non-NaN). Veuillez ouvrir une question proposant cette fonctionnalité si vous souhaitez la voir apparaître.

(Question #3150 concernait autre chose, un bogue réel dans la gestion des "dimensions de coordonnées qui ne varient pas entre chaque ensemble de données").

Ce que vous devez faire, c'est d'abord couper le chevauchement. Cela ne devrait pas être difficile - on peut supposer que vous connaissez (ou pouvez déterminer) la taille de votre chevauchement, et que tous vos NaNs sont sur un seul jeu de données. Il vous suffit d'utiliser la fonction .isel() méthode avec une tranche. Une fois que vous vous êtes débarrassé des NaN qui se chevauchent, vous devriez pouvoir les combiner sans problème (et vous ne devriez pas avoir à spécifier compat soit). Si vous utilisez combine_by_coords dans le cadre de l'ouverture de nombreux fichiers avec open_mfdataset il serait alors plus facile d'écrire une fonction de rognage que vous appliquerez d'abord en utilisant la fonction preprocess argument pour open_mfdataset .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X