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 :

Comparaison de deux matrices [Python 3.X]


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    Homme Profil pro
    etudiant
    Inscrit en
    Octobre 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2020
    Messages : 2
    Par défaut Comparaison de deux matrices
    Bonjour,

    Etudiant, en programmation je manipule des matrices représentant des coordonnées.
    Je cherche à créer une matrice se composant des lignes identiques de deux matrices précédentes.
    J'arrive à le faire avec itération sur des petites matrices mais comme je manipule des matrices avec 18 millions de lignes, je n'y arrive pas.
    Je cherche donc une fonction ou un groupe de fonction qui renverrai les lignes de coordonnées égales dans une matrice C à partir de deux matrices A et B

    D'avance, merci pour votre Aide

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut,

    Effectivement 18 millions c'est un peu long pour faire une boucle. Quand vous dites que vous n'y arrivez pas, c'est parce que cela prend trop de temps ? C'est combien trop de temps ?

    Pour faciliter les échanges vous devriez poster un exemple qui illustre votre problème et avec lequel on peut jouer. J'en propose un ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import numpy as np
     
    mat_1 = np.array([[1, 2, 3], [4, 2, 1], [3, 2, 1], [0, 0, 0]])
    mat_2 = np.array([[4, 7, 8], [0, 0, 0], [1, 2, 3]])
    Si je comprends bien votre problème vous souhaitez en sortie mat = np.array([[1, 2, 3], [0, 0, 0]]), c'est bien ça ?

    J

  3. #3
    Candidat au Club
    Homme Profil pro
    etudiant
    Inscrit en
    Octobre 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2020
    Messages : 2
    Par défaut
    Salut,

    Oui effectivement, c'est ce que je cherche à avoir.
    Pour le temps de traitement avec une boucle de 18 millions de coordonnées prend environs 3h.
    Connaissez-vous une fonction numpy ou autre pour y remédier?

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Peut être qu'une optimisation de votre code permettrait de réduire significativement le temps de traitement. Mais dans tous les cas, faire des boucles prendra toujours plus de temps que se reposer sur un calcul vectoriel avec Numpy.

    Pour y arriver il faut demander à Numpy de comparer chaque ligne de mat_1 avec mat_2 et de dire si elles sont identiques. Ce n'est pas évident du tout. On commence par créer un masque. Ce masque est une matrice contenant uniquement des booléens répondant à la question "est-ce que cette ligne de mat_1 est dans mat_2 ?" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mat_1[:, None] == mat_2
    mat_1[:, None] permet de réorganiser la première matrice. Elle devient une liste de matrices de dimension 2 qui sont les lignes. L'égalité testée va alors retourner aussi une sorte de liste de matrices de la taille de mat_2, chacune contient des booléens qui disent si l'élément de la ligne se trouve dans mat_2. Exemple avec la deuxième ligne de mat_1 : [4, 2, 1]. Si on compare avec la première ligne de mat_2, on a 4 à la première place dans [4, 7, 8], mais pas 2, ni 1. La comparaison doit retourner [True, False, False]. Si on compare cette même ligne l'ensemble de mat_2 on a [[True, False, False], [False, False, False], [False, True, False]].

    Pour chaque test on ne souhaite conserver que les lignes ayant True partout. Pour cela on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mask = (mat_1[:, None] == mat_2).all(-1).any(-1)
    Ce qui donne [True, False, False, True].

    Et on récupère les éléments correspondants avec le masque :
    J

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

Discussions similaires

  1. Erreur de comparaison de deux matrices
    Par proc02 dans le forum Débuter avec Java
    Réponses: 13
    Dernier message: 11/05/2013, 16h30
  2. Comparaison de deux matrices de char
    Par proc02 dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 10/05/2013, 15h14
  3. Comparaison de deux matrices logiques
    Par sjunod dans le forum MATLAB
    Réponses: 2
    Dernier message: 28/04/2009, 13h12
  4. [Débutant] Comparaison de deux matrices
    Par niepoc dans le forum MATLAB
    Réponses: 4
    Dernier message: 04/06/2008, 16h12
  5. Comparaison de deux matrices sans boucle for
    Par zicos dans le forum MATLAB
    Réponses: 8
    Dernier message: 04/05/2007, 18h16

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