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 :

Calculs sur de grandes matrices


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    sciences
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : sciences

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Par défaut Calculs sur de grandes matrices
    Bonjour,

    Alors je me trouve dans le cas où je veux comparer chaque élément d'une première liste à chaque élément d'une deuxième liste afin de faire des stats. Sauf que le nombre d'éléments à comparer est potentiellement énorme !
    Concrètement, mes 2 listes sont des matrices 2 colonnes contenant les coordonnées XY de nombreux points. Je chercher à calculer la distance entre chaque point de la liste A avec chaque point de la liste B afin de trouver, pour chaque point de A, la distance minimale avec B.
    De façon simple en travaillant avec numpy et en simplifiant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i in range(len(A)):
    #La jextrai les difference en X et Y pour calculer la distance :
     xdiff= A[i,0]-B[:,0] #la ja une liste de differences en X entre le ieme point de A et tous les points de B
     ydiff= A[i,1]-B[:,1] #idem en Y
     distanceMini=min(distance(xdiff, y diff)) # "distance" est une fonction qui va calculer la distance entre les 2 points a partir des difference de coordonnees X, Y.
    L'algo ci-dessus fonctionne mais peut être très long dès lors que les matrice A et/ou B contiennent des dizaines de milliers de points. J'ai fait pas mal de recherche sur google pour trouver d'autres façons (thread, multiprocessing, map, etc.) mais je n'arrive pas à optimiser ces calculs.

    D'où ma question : avez-vous des fonctions, modules, algo à me conseiller pour faire ce genre de calculs sur un grand nombre de points en python ?
    J'ai l'impression que c'est un truc de base mais vraiment je suis bloqué ! Je précise que je débute en python...

    Merci d'avance !!

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Salut,

    Citation Envoyé par Gantz007 Voir le message
    D'où ma question : avez-vous des fonctions, modules, algo à me conseiller pour faire ce genre de calculs sur un grand nombre de points en python ?
    Vous avez d'abord un problème d'algorithme. Et la bonne rubrique pour çà est algorithmique. C'est l'algorithme qui va imposer des structures de données et des bibliothèques adaptées.

    Citation Envoyé par Gantz007 Voir le message
    J'ai l'impression que c'est un truc de base mais vraiment je suis bloqué ! Je précise que je débute en python...
    La complexité d'un algorithme n'est pas un "truc": çà se calcule et c'est indépendant du langage.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert

    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
    Par défaut
    Et même dans le cas où votre algorithme serait bon, vous n'utiliser quasiment rien de numpy et donc vous en tuez toutes les performances...

    Il faut éviter les boucles for, ne pas se servir de min mais de np.min, ne pas réinventer une fonction distance puisque np.norm existe (ou à la rigueur se contenter d'écrire X**2+Y**2, pour trouver le min sur la norme au carré, ce qui évite d'avoir à appliquer la racine carré dans le calcul de la distance) ...

    Avant de parler performance, commencez sur un cas bateau avec 3 ou 4 points dans chaque liste seulement et vérifier que vous obtenez le résultat attendu. Notez que vous n'avez pas nécéssairement (à priori) la meme taille pour A et B.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    L'algo ci-dessus fonctionne mais peut être très long
    C'est combien très long ?

    Quand on veut optimiser un code, il faut faire des mesures de temps à chaque modification pour voir les impacts.

    Il faut aussi une cible : "le plus rapidement possible" est des fois ce qu'on cherche, mais pas toujours.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    sciences
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : sciences

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Par défaut
    Bonjour,

    Citation Envoyé par wiztricks Voir le message
    Vous avez d'abord un problème d'algorithme. Et la bonne rubrique pour çà est algorithmique. C'est l'algorithme qui va imposer des structures de données et des bibliothèques adaptées.
    - W
    Effectivement c'est ce que je devrais faire plutôt que d'essayer de trouver une fonction ou module magique en python. Regarder comment je pourrais améliorer ca avec des algo type tri, plus proche voisin, etc. DSL pour la mauvaise rubrique, j'ai pas trouvé comment changer de catégorie le post.

    Citation Envoyé par lg_53
    l faut éviter les boucles for, ne pas se servir de min mais de np.min, ne pas réinventer une fonction distance puisque np.norm existe (ou à la rigueur se contenter d'écrire X**2+Y**2, pour trouver le min sur la norme au carré, ce qui évite d'avoir à appliquer la racine carré dans le calcul de la distance) ...
    Avant de parler performance, commencez sur un cas bateau avec 3 ou 4 points dans chaque liste seulement et vérifier que vous obtenez le résultat attendu. Notez que vous n'avez pas nécéssairement (à priori) la meme taille pour A et B.
    Oui j'utilise bien le np.min mais effectivement la racine carré était inutile dans mon cas. Je me suis bien sur limité à quelques points sur la matrice A pour faire mes tests.

    Citation Envoyé par Bktero
    C'est combien très long ?
    De l'ordre de l'heure voir 2 pour comparer 80 000 points à 4 000 000 de points mais je ne suis pas allé au bout (et il me faudra comparer des millions à d'autres millions!). Là je suis à 7s pour comparer 100 points (A) à 4 000 000 (B). En fait je cherche à faire ce que font plus rapidement les SIG. Mais comme le dit wiztricks, c'est un problème d'algorithme avant tout et pas de python -> Post à changer de catégorie

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Citation Envoyé par Gantz007 Voir le message
    Mais comme le dit wiztricks, c'est un problème d'algorithme avant tout et pas de python -> Post à changer de catégorie
    Parfois on peut pousser une discussion dans un autre forum sans soucis. Parfois, il est clair que vous ne formuleriez pas questions et problèmes de la même façon qu'en le postant directement dans un forum Algorithme....
    Et c'est certainement pas la modération qui va reformuler votre problème pour qu'il soit un peu plus comestible par ceux qui vous liront.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Futur Membre du Club
    Homme Profil pro
    sciences
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : sciences

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et c'est certainement pas la modération qui va reformuler votre problème pour qu'il soit un peu plus comestible par ceux qui vous liront.
    Je ne le demandais pas. Il faut certainement que je reformule en effet. Sur ce, je m'en vais sur d'autres forums.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    sciences
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : sciences

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Par défaut Recherche du plus proche voisin
    Bonjour,
    Après avoir codé des algorithmes de tri et différentes possibilités offertes par numpy (jusqu'à gagner un facteur 10 sur le temps de calcul), j'ai finit par trouver ce que je cherchais dans la librairie SciPy : scipy.spatial.cKDTree qui est une implémentation de l'algorithme de recherche des plus proches voisins de Maneewongvatana et Mount (1999).
    Pour faire court :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Import scipy.spatial
     
    def findPlusProcheVoisin(matriceA,MatriceB,rayonDeRechercheVoulu):
        arbre=scipy.spatial.cKDTree(MatriceB)
        distance,indices=arbre.query(matriceA,k=1,distance_upper_bound=rayonDeRechercheVoulu)
        return indices
     
    indicesRecherches=findPlusProcheVoisin(A,B,2)
    De cette façon on récupère, pour chaque point XY de A, l'indice du plus proche voisin dans B.
    distance_upper_bound permet de limiter le rayon de recherche (mis à 2 dans le cas présenté). Attention, dans le cas où un point de A est à une distance de tout point de B supérieure à distance_upper_bound, le query renvoi une distance infinie et un indice égal à la taille de la matrice B en entrée.
    Pour info j'ai divisé le temps de calcul sur plusieurs millions de points par environ 250 en utilisant cKDTree.
    Pour finir, un post intéressant sur cette problématique.

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

Discussions similaires

  1. calcul valeurs et vecteurs propres de grande matrice
    Par celine2011 dans le forum Mathématiques
    Réponses: 21
    Dernier message: 15/03/2011, 13h48
  2. Réponses: 14
    Dernier message: 05/10/2010, 15h26
  3. Calculs sur Grands entiers.
    Par elishac dans le forum Caml
    Réponses: 20
    Dernier message: 22/06/2009, 09h22
  4. Calculs sur une matrice
    Par tarek30 dans le forum JBuilder
    Réponses: 2
    Dernier message: 22/04/2009, 13h21
  5. Calcul sur des matrices
    Par Ptinéwik dans le forum MATLAB
    Réponses: 2
    Dernier message: 21/01/2008, 10h37

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