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 :

trouver valeur la plus proche dans une colonne


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Par défaut trouver valeur la plus proche dans une colonne
    Bonjour

    je cherche à savoir comment fait on pour trouver dans une colonne, à partir d'une valeur donnée, la valeur la plus proche soit inferieure ou superieure

    le but ecrire une fonction pour trouver dans un tableau, la ligne qui correspond à ma valeur cherchée

    merci pour l'aide

  2. #2
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    salut,

    Déjà, ton tableaux est-il une liste de liste ? (je pense que oui mais sait-on jamais...)
    Si oui, est-ce un liste de lignes ou une liste de colonnes ?

    Partons du principe que c'est une liste de lignes que l'on appelle "Tab"

    Un élément du tableau ligne correspond donc à "Tab[num_ligne][num_colonne]"
    La longueur d'une ligne = longueur d'une des liste de Tab
    longueur d'une colonne = longueur de Tab

    si l'on voulait afficher chaque éléments de la deuxième ligne par exemple, on pourrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for idx_colonne in range(len(Tab[1])):
        print Tab[1][idx_colonne]
    Ici l'élément variable est le numéro de colonne

    Si maintenant on veut afficher chaques éléments de la troisième colonne par exemple, on pourrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for idx_ligne in range(len(Tab)):
        print Tab[idx_ligne][2]
    Ici l'élément variable est le numéro de ligne

    Maintenant tu devrai être en mesure de parcourir un colonne, maintenant pour savoir quelle valeur dans cette colonne, est la plus proche d'un valeur précise... tu devrais pouvoir trouver, ceci dit une fonction qui te sera utile est abs(), qui sert à obtenir la valeur absolue d'un nombre...

  3. #3
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Valeurs entières, réelles, char ?
    Quantité de données manipulées ?

    Tu as des algo de recherche opérationnelles à ce sujet.
    Tu peux utiliser un curseur sur ton tableau trié.
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    tableau_general = [0,1,1,2,3,5,6,9,111,112,113,114]
    curseur1 = 0
    curseur2 = 5
    curseur3 = 10
    Après tu compares ta valeur à scanner par rapport à la valeur de tableau_general[curseur1], tableau_general[curseur2].
    Si entre ces deux, tu scannes entre les deux. Sinon, tu regardes avec les prochains curseurs.
    Tu peux ensuite faire en sorte de faire ce genre de checks dynamiquement (dichotomie et consorts)

    Si non trié, ce n'est pas le même problème. Tu peux mettre en œuvre un arbre (binaire) de recherche. C'est plus une question algorithmique qu'autre chose comme tu le vois...
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Par défaut
    pour info

    mon tableaux fait 9 colonnes sur 600000 ligne environs, c'est un tableau de floattant (je suis désolé j'ai du mal avec liste, tableau en python, je viens de matlab)
    Ce tableau ressemble à une matrice en fait

    je souhaite en donnant une valeur quelconque parcourir ma colonne et trouver la valeur la plus proche

    apparemment c'est un problème d'algo, il n'y a pas de fonction prédéfinie, je me penche dessus et je vous tiens au courant

    merci d'avance

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    J’ai pensé à ça:


    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
    from numpy import array
     
    tab = array([[12.3,4.09,34.5,76.4],[23.4,26.7,113.9,46.98],[26.66,3.67,32.8,67.906],\
                 [9.544,32.546,44.3214,45.67],[32.897,64.773546,24.3667,892.45],\
                 [23.45,34.33,10.34,29.4],[2.45,3.0,8.23,54.0],[23.894,43.82,332.784,4.73]])
    print tab,'\n'
     
     
    li = list((x for x in tab[:,2]))
    li.sort()
     
    val = 53.4
     
    if li[0]>val:  print li[0],'>',val,'\npas de valeur inferieure a',val
    elif li[-1]<val:  print li[-1],'<',val,'\npas de valeur superieure a',val
    else:
        a = li[0]
        for x in li:
            if x>val:
                print a,'  / val =',val,'/  ',x
                break
            a = x
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [[  12.3         4.09       34.5        76.4     ]
     [  23.4        26.7       113.9        46.98    ]
     [  26.66        3.67       32.8        67.906   ]
     [   9.544      32.546      44.3214     45.67    ]
     [  32.897      64.773546   24.3667    892.45    ]
     [  23.45       34.33       10.34       29.4     ]
     [   2.45        3.          8.23       54.      ]
     [  23.894      43.82      332.784       4.73    ]] 
     
    44.3214   / val = 53.4 /   113.9

    Je n’aime pas trop la fabrication d’un objet liste quand il y a 600 000 lignes mais on y est obligé si on veut pouvoir faire un sort().

    Le sort() classe sur place, tandis qu’un sorted() crée une liste supplémentaire à la liste d’origine, d’après ce que j’ai compris dans la doc.

    Je ne vois pas comment créer un itérateur à partir de tab[:,2] et en ayant un classement quelque part.

    Il doit y avoir des tonnes de solutions qui ont été proposées sur ce problème depuis des lustres, il faut chercher s’il y a mieux.

  6. #6
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Bonjour,

    Je reste sur un arbre de recherche. C'est un peu fastidieux à mettre en œuvre mais c'est efficace.
    Si tu ne connais pas cette structure, un petit memo:
    Tu pars du premier élément. Si la valeur suivante est plus grande, elle devient successeur "à droite", sinon successeur "à gauche"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Pour la liste (4,3,5,2,2.5):
                                                  4
                                                 / \
                                                3   5
                                              /       
                                             2
                                               \
                                                 2.5
    Tu peux facilement ensuite selon ton implémentation savoir si tu es plus grand ou plus petit. Si tes colonnes ne bougent pas trop, pour l'ordonnancement c'est bien pratique. Cherche sur le web, il y a pas mal d'implémentations toutes faîtes. Souvent on recherche une valeur exacte mais tu peux raffiner grâce à cette structure vu que tes bornes sont aussi tes éléments.

    Si tu as besoin d'aide pour implémenter cela, n'hésite pas.

    Je partirais sur une base objet:
    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
     
    class ABR:
       def __init__(self,...):
          ...
     
       def insere(self, element):
          """ insère un élément dans l'arbre """
          ...
     
       def contientSup(self, element):
          """ 
          retourne la valeur de l'élément si trouvé, sinon l'élément le plus proche supérieur 
          """
     
       def contientInf(self, element):
          """
          retourne la valeur de l'élément si trouvé, sinon l'élément le plus proche inférieur
          """
    A combiner avec une classe Noeud ou Node selon le choix de la langue.
    J'ai trouvé cela aussi : lien
    Hope it helps !
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

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

Discussions similaires

  1. Déterminer la Valeur la plus grande dans une table
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 9
    Dernier message: 22/08/2014, 23h35
  2. Trouver la valeur la plus proche dans une ligne
    Par tavita987 dans le forum Excel
    Réponses: 5
    Dernier message: 05/02/2014, 11h12
  3. Latitude / longitude la plus proche dans une BD
    Par _cheval_ dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/09/2010, 00h46
  4. [XL-2002] Top 10 des mots les plus fréquent dans une colonne de mots
    Par _gege_ dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/07/2010, 23h20
  5. Valeur la plus courante dans une colonne
    Par phoque.r dans le forum Excel
    Réponses: 2
    Dernier message: 28/05/2007, 13h37

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