IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

Comparer deux champs de tailles différentes


Sujet :

Calcul scientifique Python

  1. #1
    Membre du Club
    Inscrit en
    Mai 2011
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 72
    Points : 49
    Points
    49
    Par défaut Comparer deux champs de tailles différentes
    Bonjour à vous,

    Je cherche à comparer deux champs (le premier est sous forme x y z , soit lon lat et valeur), et le deuxième champ est un champ 2D provenant d'un modèle numérique.
    Les deux ont une zone en commun, mais les deux données ne sont pas de la même résolution, le plus résolu étant le premier (couvrant un champ 2D de 4950x4950 points) alors que le deuxième provenant du modèle numérique (1350 points sur 750).

    Je suppose donc qu'il faut avoir une grille commune, idéalement sur le champ le moins résolu (du modèle numérique). Il faut donc réenchantillonner le premier champ.

    Voici mon début de code, qui ne fonctionne pas en l'état
    :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    from mpl_toolkits import basemap
    from netCDF4 import Dataset
    import numpy as np
    import matplotlib.pyplot as plt
     
    file1 = np.loadtxt("mosaique_antilope_lamb_20171001.xyz", unpack=True)
    file2 = np.loadtxt("lonlat", unpack=True)
     
    anlon = file2[0,:]
    anlat = file2[1,:]
    antilope = file1[3,:]
     
    filename = '20171001.nc'
    with Dataset(filename, mode='r') as fh:
       arlon = fh.variables['longitude'][:]
       arlat = fh.variables['latitude'][:]
       arome1 = fh.variables['unknown'][:].squeeze()
     
    anlat=np.flipud(anlat)
    arlat=np.flipud(arlat)
     
    anlon_sub, anlat_sub = np.meshgrid(anlon,anlat)
    arlon_sub, arlat_sub = np.meshgrid(arlon,arlat)
     
    arome = basemap.interp(arome1, arlon, arlat, anlon_sub, anlat_sub, order=1)
    antil = basemap.interp(antilope, anlon, anlat, arlon_sub, arlat_sub, order=1)
     
    plt.subplot(1,2,1)
     
    plt.pcolormesh(anlon,anlat,arome)
     
    plt.subplot(1,2,2)
     
    plt.pcolormesh(anlon,anlat,antil)
    Premiere question : je n'arrive pas à mettre en 2D mon champ en x y z. Ensuite comment faire pour que ce champ corresponde à celui du modèle ? (arome ici)

    Merci à vous pour vos pistes

    Cordialement,
    Jonathan

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Salut

    1) Construit des fichiers d'exemples petit (genre 10 pixels par 10) et met les ici pour qu'on puisse traiter avec eux.

    2) Si la résolution n'est pas la même tu ne peux pas récréer d'information pour comparer. Il faut faire avec ce que tu as. Sur ta grille la plus fine, tu fais des moyennes pour connaitre la valeur que ca donnerait sur une grille plus grossière. Et tu compares les résultats sur grille grossière.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2011
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 72
    Points : 49
    Points
    49
    Par défaut
    Merci de ta réponse lg_53,

    Depuis hier j'ai avancé un peu, mais je bloque au même point :
    Sur cette image on voit 2 champs, un avec une résolution plus grossière (champ modèle), affiché avec un pcolor, et l'autre un champ en scatter plot qui correspond à mon champ plus résolu. Je cherche évidemment à comparer ces deux champs et donc de comparer point par point les deux champs. Pour cela je pense que je dois :

    -interpoler le champ plus résolu sur l'ensemble de la grille pour avoir un champ continu. Partir sur le griddata de scipy ? Comment faire pour que ce soit le mieux optimiser question temps de calcul (car il y aura des centaines de fichiers à comparer)
    -dégrader la résolution de ce nouveau champ pour correspondre à la grille du champ grossier (et donc moyenner le champ continu)



    Je vois pas trop comment je peux faire pour creer les fichiers exemple que tu me demandes par contre :/

    Merci encore

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Ok, on comprends mieux là déjà.
    Mais du coup, par exemple en haut à droite de ton image, tu as une info dans le pcolor mais tu n'as aucun point. Tu voudrais comparer quoi là à cet endroit précis ?

    Si à la question précédente, tu me réponds on ne compare rien dans ce cas tu peux comparer tes deux set de données ainsi :
    Dans chaque maille, tu dois identifier :
    - la valeur donnée par le champ modèle
    - les points données par le champ plus résolu (éventuellement 0 points) : lesquels font parti de cette maille ? quels est leur valeur ?
    - S'il y a des points calculer leur moyenne, et la comparer à la valeur donnée par le champ modèle, sinon ne rien faire (ou retourner une erreur de 0).

    En sortie tu aura un champ d'erreur qui aura la même résolution que ton maillage le plus grossier

    -interpoler le champ plus résolu sur l'ensemble de la grille pour avoir un champ continu. Partir sur le griddata de scipy ? Comment faire pour que ce soit le mieux optimiser question temps de calcul (car il y aura des centaines de fichiers à comparer)
    -dégrader la résolution de ce nouveau champ pour correspondre à la grille du champ grossier (et donc moyenner le champ continu)
    Oui tu peux aussi partir sur les interpolations proposées par scipy. Une moyenne est une interpolation. Interpoler dans l'autre sens pour récréer depuis la grille grossière des informations à l'échelle de ta simulation la plus fine me parait pas bon car ton interpolation va elle même introduire une erreur.
    Pour l'optimisation du calcul là c'est pas pour tout de suite. Il faut déjà un truc qui fonctionne sur une image avant de se poser ce genre de question. A ce moment là tu pourras représenter ton code (avec les fichiers de données si tu ne peux pas construire de petit exemples) pour qu'on puisse le faire tourner et voir.

Discussions similaires

  1. [Débutant] Comparer deux vecteurs de tailles différentes
    Par arlyk dans le forum MATLAB
    Réponses: 12
    Dernier message: 29/01/2014, 16h16
  2. comparer deux champs à encodages différents dans phpmyadmin
    Par shynobu dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/05/2012, 10h12
  3. [AC-2007] Comparer deux champs dans deux sous formulaires différents
    Par jerome94 dans le forum IHM
    Réponses: 20
    Dernier message: 15/02/2012, 08h35
  4. Réponses: 1
    Dernier message: 29/03/2007, 19h17
  5. Soustraction de deux images de tailles différentes
    Par biquet dans le forum Images
    Réponses: 3
    Dernier message: 26/01/2007, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo