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 :

parcourir et écrire dans une matrice


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Par défaut parcourir et écrire dans une matrice
    Bonjour à tous,

    je me permets d'ouvrir cette discussion n'ayant pas trouvé de solution à mon problème (je débute en python).
    Je cherche à générer ce type de matrice:

    L vers C 10325CT 10405GA 10414GA 1057TC 10674CT
    10325CT
    10405GA
    10414GA
    1057TC
    10674CT

    et de la remplir comme suit:

    10325CT 10405GA 10414GA 1057TC 10674CT
    10325CT ind1_ind2 ind1_ind3
    10405GA ind4
    10414GA ind6_ind8
    1057TC ind1_ind2
    10674CT

    L'idée est de regrouper les individus qui partagent les même mutations dans cette matrice: exemple l'individu 1 et 2 (ind1_ind2) partagent les mutations 10325CT-10405GA et 1057TC-10405GA pour ensuite générer un network:
    En réalité cette matrice à 188 lignes et 188 colonnes et je cherche à la remplir automatiquement.

    J'ai fais le script qui me sort les couples de valeurs qui m'intéressent ainsi que le script pour générer le network. Néanmoins je n'arrive pas à remplir la la matrice automatiquement:
    Début de mon code;

    dicoFUll={....}#dico avec comme clés les mutations et en valeurs les listes d'individus qui partagent ces mêmes mutations
    listFull=[...] contient la liste d'individus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    from collections import OrderedDict
    dicoFUllb=OrderedDict(sorted(dicoFUllb.items(),key=lambda t: t[0]))#pour ordonner mon dico et que chaque liste d'individus sortent dans le même ordre pour chaque mutation
     
    with open ('matriceFinalNetworks.csv','rb') as f:
    	reader = csv.DictReader(f, delimiter=',')
    	headers = reader.fieldnames
    	with open ('matriceFinalNetworks2.csv','ab') as f1:
    		fieldnames=headers
    		writer = csv.DictWriter(f1, delimiter=',', fieldnames=fieldnames)		
    		for cle, value in dicoFUll.items():
    			if value == listeFull[0]:# ici je recherche les individus qui partagent une meme mutation. Ce n'est pas hyper optimisé je dois changer manuellement l'indice listeFull[0]...
                                    samplesSharesMutations=cle,	value#stock
                                    writer.writerow([samplesSharesMutations]) #### c'est ici que je n'arrive pas à écrire les résultats comme dans l'exemple plus haut de ma matrice. J'ai regardé du côté de numpy mais je suis un peu perdu.
    Merci pour votre aide

  2. #2
    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
    Bonjour

    J'ai plusieurs commentaires à faire voyant le code que tu as posté.
    1) Au niveau de la structuration : Hésite pas à séparer un peu plus les choses que tu veux faire. Là j'ai l'impression que tu veux tout faire en même temps.
    Je verrais plutot qqch comme ça :
    Etape 1 : Tu lis ton fichier de départ et tu stocke son information dans une liste (chaque élément de la liste correspond à une ligne de ton fichier et est donc la liste des mutations de cet individu), ou bien un dictionnaire du style { nom_individu : [liste_de_ses_mutations] }
    Etape 2 : Tu construit un dictionnaire ayant le style { nom_mutation : [liste_individu_portant_la_mutation] }
    Etape 3 : Tu écrit le dictionnaire que tu vient de construire dans un nouveau fichier

    2) Pour réaliser l'étape 2, tu n'as pas besoin de chercher texto les mutations partagées entre les individus !
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    population = { 'ind1': [ 'mutA', 'mutB' ], 'ind2':[ 'mutB', 'mutC' ]}
    dico_par_mut = {}
    for ind_name,list_mut in population.items() :
        for mut in list_mut : ### Pour chaque individu, on parcours ses mutations
            if mut in dico_par_mut.keys() :
                 dico_par_mut[mut]+=[ind_name] #### On ajoute un individu a une mutation dejà connue
            else :
                 dico_par_mut[mut]=[ind_name]#### On ajoute une nouvelle mutation (et l'individu sur lequel on l'a détecté) au dico
    print(dico_par_mut)
    3) numpy ne me parait pas utilisable ici. Tout simplement parceque ca gère des matrices homogènes, c'est à dire que le nombre d'éléments sur chaque lignes est le meme. Ici ce n'est pas du tout le cas chez toi, chaque individu pouvant avoir un nombre de mutation arbitraire.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Par défaut
    Bonjour ig_53,

    Merci beaucoup pour tes commentaires bien instructifs.
    Sans abuser de ton temps et de ton aide, aurais-tu une piste pour générer ce genre de matrice à partir de dico_par_mut pour reprendre l'exemple de ton code?

    Mon idée serait de générer ce genre de matrice: cf photo jointe

    Nom : exemple_matrice.png
Affichages : 2207
Taille : 34,9 Ko

    je n'arrive pas écrire sous cette forme avec writer ou DictWriter.
    J'ai réalisé après un script qui me permet de parcourir ce genre de matrice et de créer des liens entre les individus qui partagent les mêmes mutations pour ensuite générer un network.
    Je ne trouve pas de solution pour générer le plus automatiquement possible ce genre de matrice.

    Merci beaucoup pour ton(votre) aide .

  4. #4
    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
    Je crois ne pas avoir bien saisi ton problème.

    Corrige moi si je me trompe.
    Tu veux créer une matrice carrée (appelons là A). Chaque ligne et chaque colonne corresponderaient à une mutation. Ainsi chaque élément A_{i,j} de ta matrice serait la liste des individus possédant à la fois la mutation i et la mutation j ?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Par défaut
    Désolé pour le manque de clarté.
    Je pense que tu as bien saisi mon problème. Je rajoute des exemples pour tenter de clarifier au plus mon problème
    A titre d'exemple:
    L'idée est de partir de cette:
    Nom : matriceInitiale.png
Affichages : 2020
Taille : 5,9 Ko

    On peut voir que les lignes (mutations) sont les même mutations qu'en colonnes.
    Je cherche à remplir cette matrice de manière automatique pour avoir cette matrice:
    Nom : exMatrice2.png
Affichages : 1985
Taille : 5,5 Ko

    Si on lit les intersections lignes colonnes pour indiv1_indiv2: On peut voir qu'à la ligne 2, la mutation 10325CT est partagée par les individus "indiv1_indiv2" avec la mutation 10405GA (colonne c) etc...
    En gros je voudrais écrire par exemple à cette intersection ligne 2 colonne C "indiv1_indiv2" (exemple ci dessus).
    Avec le module csv de python je n'arrive pas écrire à une intersection ligne colonne par exemple

    En espérant être plus claire mais je pense que tu as parfaitement saisi mon problème.
    Merci

  6. #6
    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
    Il te suffit alors de parcourir 2 à 2 toutes les clés du dico que tu as construit, et de détecter les individus en commun dans les listes d'invidus associées à ces 2 clés (qui sont les mutations)...


    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
    population = { 'ind1': [ 'mutA', 'mutB' ], 'ind2':[ 'mutB', 'mutC' ], 'ind3': ['mutA','mutB','mutC']}
    dico_par_mut = {}
    for ind_name,list_mut in population.items() :
        for mut in list_mut : ### Pour chaque individu, on parcours ses mutations
            if mut in dico_par_mut.keys() :
                 dico_par_mut[mut]+=[ind_name] #### On ajoute un individu a une mutation dejà connue
            else :
                 dico_par_mut[mut]=[ind_name]#### On ajoute une nouvelle mutation (et l'individu sur lequel on l'a détecté) au dico
    print(dico_par_mut)
     
     
    def common_elements(list1, list2):
        return [element for element in list1 if element in list2]
     
    list_mut = list(dico_par_mut.keys())
    n=len(list_mut)
    network = [ [ "" for j in range(n) ] for i in range(n) ]
     
    for i in range(n) :
        for j in range(n) :
            list1_ind = dico_par_mut[list_mut[i]]
            list2_ind = dico_par_mut[list_mut[j]]
            a = common_elements(list1_ind,list2_ind)
            network[i][j] = '_'.join(a)
     
    print(network)
    Et ici network[i][j] représente la valeur du tableau que tu veux à la i-ieme ligne, j-ieme colonne.

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/10/2012, 15h46
  2. Réponses: 13
    Dernier message: 30/04/2010, 10h27
  3. chercher un tableau dans une matrice
    Par devdébuto dans le forum C
    Réponses: 12
    Dernier message: 11/12/2005, 01h26
  4. [Forms 6i] Parcourir un block dans une PLL
    Par macben dans le forum Forms
    Réponses: 2
    Dernier message: 28/09/2005, 10h13
  5. angles possibles dans une matrice
    Par bigbill dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 05/05/2005, 17h08

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