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

Python Discussion :

Obtenir toutes les coordonnées dans une matrice des éléments égaux à une valeur donnée


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Par défaut Obtenir toutes les coordonnées dans une matrice des éléments égaux à une valeur donnée
    Bonjour,

    J'ai un souci pour appeler la fonction plot de la bibli matplotlib.pyplot avec un suite de valeurs. Je m'explique.
    Je lis une matrice NxN contenant des valeurs de 1 à 6 et je voudrais appeler la fonction plot pour dessiner des cercles de couleurs pour toutes les positions de ma matrice contenant un 1, une autre couleur pour les positions contenant un 2 etc... jusqu'à 6.

    Si je lis la matrice point par point et qu'à chaque point j'affiche un cercle de la bonne couleur, les temps
    de traitements sont beaucoup trop longs (20mn pour une matrice 1000x1000).

    Je cherche donc à limiter le nombre d'appels de la fonction plot.
    L'idée et d'appeler une fois la commande plot par couleur.
    Cela donnerait quelque chose comme :

    plt.plot(Coordonnées_X_Valant_0, Coordonnées_Y_Valant_0, 'ro')
    plt.plot(Coordonnées_X_Valant_1, Coordonnées_Y_Valant_1, 'ro')
    plt.plot(Coordonnées_X_Valant_2, Coordonnées_Y_Valant_2, 'ro')
    ....
    plt.plot(Coordonnées_X_Valant_6, Coordonnées_Y_Valant_6, 'ro')

    Ma question est donc : quelqu'un a-t-il une solution pour extraire les coordonnées x,y d'une matrice pour toutes les positions dont la valeur est égale à une valeur paramètre ?
    Le résultat doit se présenté sous une succession de chiffres (les coordonnées) sans pour autant ne pas être ni une liste ni un tuple.
    Le bon exemple de code est un exemple que j'ai trouvé sur les modèles matplotlib :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def f(t):
        'A damped exponential'
        s1 = np.cos(2 * np.pi * t)
        e1 = np.exp(-t)
        return s1 * e1
     
    t1 = np.arange(0.0, 5.0, .2)
    l = plt.plot(t1, f(t1), 'ro')
    plt.setp(l, 'markersize', 30)
    plt.setp(l, 'markerfacecolor', 'C0')
     
    plt.show()
    Mon besoin est de remplacer le np.arrange par Coordonnées_X_Valant_0 et le f(t1) par Coordonnées_Y_Valant_0

    J'espère avoir été clair dans mon explication.
    Merci.

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    je ne suis pas expert avec numpy mais il me semble que numpy.argwhere() correspond à ce que tu cherches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> z = numpy.random.randint(1,7,size=(5,5))
    >>> z
    array([[1, 5, 2, 6, 5],
           [1, 1, 4, 3, 5],
           [3, 6, 6, 1, 4],
           [5, 5, 4, 4, 6],
           [4, 6, 6, 3, 2]])
    >>> numpy.argwhere(z == 1)
    array([[0, 0],
           [1, 0],
           [1, 1],
           [2, 3]])

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Par défaut
    Merci beaucoup. Je vais regarder ce soir mais j'ai l'impression que le résultat est [X, Y] alors que j'ai besoin de les séparer, les X puis les Y et en plus je ne suis pas sûr que le format array convienne.

    Je vais regarder sur la doc ce que l'on peut faire avec cela.

    Merci

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    t'as envisagé de faire une boucle for ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for x,y in np.argwhere(z == 1):
       mafonction(x, y)

  5. #5
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Par défaut
    Bon, je ne suis pas un pro donc désolé si je n'utilise pas les bons termes...

    Avec une boucle for, je peux parcourir la matrice mais si l'appel plot est dans la boucle alors je l'appelle autant de fois qu'il y a de points dans la matrice ce qui est la cause de la lenteur.
    Ce que j'ai essayé c'est d'inclure la boucle dans l'appel plot. Mais je n'ai pas réussi, il faut 2 boucles for imbriquées pour lire la matrice même pour n'obtenir que les X voulus....
    for x in range(0,nbr_lignes_matrice):
    ......for y in range(0,nbr_colonnes_matrice):

    De plus, dans l'exemple que j'ai trouvé, les X sont fournis par une fonction arrange(), le résultat n'est pas une liste mais une succession de chiffres. Cette succession de chiffres est vue par plot comme des entrées successives de coordonnées X. Pour chaque X, la fonction f(t1) retourne un Y.
    Si tu fait tourner le petit prog que j'ai présenté en ajoutant un print(t1), tu obtiens :
    [0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 ........... 4.4 4.6 4.8]
    Il n'y a pas de virgules entre les chiffres.

    Même en mettant une fonction qui retourne les X, j'obtiens un résultat sous forme de liste.
    Je suis pas sûr que je vais aboutir ...
    Je vais regarder la fonction que tu as proposé si je n'y arrive pas, je vais chercher un autre mode d'affichage.
    Merci du coup de main.

  6. #6
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2013
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Novembre 2013
    Messages : 76
    Par défaut
    Je viens de tester ta proposition argwhere et celui de la boucle for,

    Le argwhere seul renvoi une liste qu'il faut spliter en x et y donc autant d'appel de la fonction plot.

    Pour la boucle,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for x,y in np.argwhere(z == 1):
       plot(x, y,'ro')
    idem, on appelle la fonction plot autant de fois qu'il y a de coordonnées x,y valident. Donc pour une matrice 1000x1000 on l'appelle 1 million de fois....
    Dommage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Somme d'une partie des éléments d'une matrice
    Par pa243 dans le forum MATLAB
    Réponses: 5
    Dernier message: 30/05/2015, 19h39
  2. Réponses: 1
    Dernier message: 27/12/2012, 05h40
  3. Réponses: 5
    Dernier message: 05/07/2011, 14h45
  4. [Débutant] Obtenir toutes les coordonnées d'un vecteur sans exception
    Par chevalvapeur dans le forum Images
    Réponses: 5
    Dernier message: 03/12/2009, 20h32
  5. Somme récursive des éléments d'une matrice
    Par lo_pascal dans le forum Pascal
    Réponses: 4
    Dernier message: 18/01/2008, 11h08

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