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 :

Lire et concaténer des données


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut Lire et concaténer des données
    Bonjour,

    J'ai plusieurs fichiers nommés tracex007 dans plusieurs répertoires (dont les noms sont concaténés dans Model) que j'aimerais ouvrir puis enregistrer.
    Ces fichiers tracex007 sont simplement les données d'un signal avec un colonne pour le temps et une autre pour son amplitude
    Je souhaiterais faire une boucle pour lire les fichiers concernés dans les répertoires voulus et en sortir deux matrices de dimension 2: time avec tous les temps, ampl avec toutes les amplitudes et évidemment que les indices entre time et ampl correspondent au même signal.

    j'ai commencé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Model=['73', '74', '75', '76', '70']
    Receiver='07'
    ii=0
    time=[]
    ampl=[]
    for mod in Model:
     DirFile= './%s/tracex0%s' %(mod,Receiver)
     signal = np.loadtxt(DirFile)
     time([[:],[ii]])=signal[:,0]
     ampl([[:],[ii]])=signal[:,1]
     ii += 1
    me ressort :

    time([[sizeTime],[ii]])=signal[:,0]
    SyntaxError: can't assign to function call
    Je ne dois pas avoir la bonne syntaxe. Peut être faut il utiliser .append mais je n'arrive pas l'utiliser dans ce cas.

    Merci pour votre aide.
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Newenda Voir le message
    Je ne dois pas avoir la bonne syntaxe. Peut être faut il utiliser .append mais je n'arrive pas l'utiliser dans ce cas.
    Vous avez déclaré time et ampl comme list Python: pour y ajouter des objets, c'est effectivement .append...
    Mais comme vous voulez fabriquer une matrice numpy à deux dimensions, la syntaxe pourrait s'appliquer à un array numpy mais vous ne l'avez pas créé... Comme de toutes façons, vous ne connaissez pas à priori la taille de l'array numpy que vous voulez créer, il faut chercher dans la documentation numpy comment "empiler" ou "concaténer" une ou plusieurs arrays.

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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Merci pour votre réponse,

    Stack devrait faire l'affaire parfaitement mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Model=['73', '74', '75', '76', '70']
    Receiver='07'
    ii=0
    time=[]
    ampl=[]
    for mod in Model:
     DirFile= './%s/tracex0%s' %(mod,Receiver)
     signal = np.loadtxt(DirFile)
     sizeTime=len(signal)
     time=np.stack(signal[:,0])
     ampl=np.stack(signal[:,1])
    me garde pas les data (signal) les uns après les autres mais qu'un seul.

    et je ne vois pas pourquoi, il n'y a pas beaucoup d'exemple pour osn utilisation dynamique dans une boucle

    et si j'utilise append comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Model=['73', '74', '75', '76', '70']
    Receiver='07'
    ii=0
    time=[]
    ampl=[]
    for mod in Model:
     DirFile= './%s/tracex0%s' %(mod,Receiver)
     print DirFile
     signal = np.loadtxt(DirFile)
     time.append(np.array(signal[:,0]))
     ampl.append(np.array(signal[:,1]))
      print time.shape
     
     ii += 1
    il me renvoi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: 'list' object has no attribute 'shape'
    alors que je pensais que np.array(data) transformait une liste en array justement.
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    je ne vois pas pourquoi, il n'y a pas beaucoup d'exemple pour osn utilisation dynamique dans une boucle
    Imaginez additionner les 10 premiers entiers dans une boucle en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    s = 0
    for x in range(10):
         s = x
    print (s)
    çà va afficher la dernière valeur de x.

    En écrivant time=np.stack(signal[:,0]), vous ne faites pas grand chose d'autre.

    Et vous pouvez toujours chercher une solution sur Internet, çà ne sera pas facile car c'est la maîtrise des constructions de base qui vous manquent.

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

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Oui justement, j'ai essayé des constructions avec indexage comme dans un premier post, avec append ensuite et stack etc.
    Ces constructions ne me paraissent pas aberrante de sens lorsqu'on regarde la documentation.
    Pourriez vous me mettre sur la voie?

    Dois je utiliser un indexage pour une construction dynamique dans une boucle ? puis je utiliser append ou comment utiliser stack ? comment définir une array si ce n'est pas par np.array() ?

    Merci pour toutes remarques qui me feraient avancer.
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Pour rendre ma question plus simple:

    Voici mon code, je transforme bien mes valeurs en array car toutes les valeurs sont des floats et tous les fichiers signals ont la même dimension.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Model=['73', '74', '75', '76', '70']
    Receiver='07'
    ii=0
    time=[]
    ampl=[]
     for mod in Model:
     DirFile= './%s/tracex0%s' %(mod,Receiver)
     
     signal = np.loadtxt(DirFile)
     
     time = np.array(signal[:,0],float)
     ampl = np.array(signal[:,1],float)
     
     ii += 1
    J'aimerais connaitre la syntaxe d'indexage pour remplir les variables "time" et "ampl" à chaque itération de la boucle.

    Ou alors est il possible d'utiliser STACK ou CONCATENATE dans une boucle. En ajoutant simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     time = np.array(signal[:,0],float)
     a=np.stack(time)
     ampl = np.array(signal[:,1],float)
     b=np.stack(ampl)
    ça ne fonctionne pas, a et b sont écrasés au fur et à mesure.



    Merci d'avance
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Il vous faut choisir entre construire des listes et construire des arrays numpy.
    Les deux solutions fonctionnent mais le code ne sera pas le même.
    Après, il faut être curieux et accepter que Python ne va pas vous mordre pour tester vos idées.
    Prenons un array 3 x 3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> test = np.array([[1,2,3],[4,5,6],[7,8,9]])
    >>> test
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    Si vous voulez extraire la première colonne sous la forme d'une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> liste = []
    >>> liste +=  test[:,0].tolist()
    >>> liste
    [1, 4, 7]
    >>> liste +=  test[:,0].tolist()
    >>> liste
    [1, 4, 7, 1, 4, 7]
    >>>
    Vous avez les ingrédients de base, à vous de les composer pour faire votre boucle.

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

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    J'ai choisi de tout faire en format array, afin de gagner du temps de calcul et car je sais que toutes mes données ont le même format et la même dimension.
    Je n'ai pas été chiche quant aux nombres d'essais d'indexage et d'utilisation de concatenate ou stack.

    Mais dans votre dernier message, il semble que ce soit une toute autre façon de faire dont je ne maîtrise absolument pas le vocabulaire, ni même le sens.
    += ajoute et également que le tolist permet de transformer une array en list mais je vois pas du tout en quoi cela peut m'aider à concaténer mes time et ampl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    time +=  signal[:,0].tolist()
    me renvoit une array de dimension 1 de longueur unitaire multipliée par le nombre de fichiers ouvert mais je ne vois pas comment faire d'indexage (sans reshaper)

    Peut être n'est ce pas possible de faire de l'indexage aussi simplement qu'avec matlab..

    Merci pour votre temps.
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Newenda Voir le message
    Mais dans votre dernier message, il semble que ce soit une toute autre façon de faire dont je ne maîtrise absolument pas le vocabulaire, ni même le sens.
    += ajoute et également que le tolist permet de transformer une array en list mais je vois pas du tout en quoi cela peut m'aider à concaténer mes time et ampl
    Ben si vous partez de:
    vous exprimez l'intention de fabriquer 2 listes de...
    Et comme ce sont juste des listes de float autant garder des listes Python (que vous êtes supposé maîtriser) plutôt que des arrays numpy (que vous êtes en train de découvrir).

    Citation Envoyé par Newenda Voir le message
    renvoit une array de dimension 1 de longueur unitaire multipliée par le nombre de fichiers ouvert mais je ne vois pas comment faire d'indexage (sans reshaper)
    Ça vous fabrique une liste de float que vous pouvez indexer comme n'importe quelle autre séquence.

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

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Merci pour ces éclaircissements.

    EN utilisant donc apend comme ceci

    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
    Model=['74', '75', '76']
    Receiver='07'
    ii=0
    signal=[]
    time=[]
    ampl=[]
    for mod in Model:
     path= './%s/tracex0%s' %(mod,Receiver)
     
     signal = np.loadtxt(path)
     
     time.append(signal[:,0])
     ampl.append(signal[:,1])
     
    print time
    retourne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [array([  2.00000000e-04,   1.02000000e-02,   2.02000000e-02, ...,
             3.99602000e+01,   3.99702000e+01,   3.99802000e+01]), array([  2.00000000e-04,   1.02000000e-02,   2.02000000e-02, ...,
             3.99602000e+01,   3.99702000e+01,   3.99802000e+01]), array([  2.00000000e-04,   1.02000000e-02,   2.02000000e-02, ...,
             3.99602000e+01,   3.99702000e+01,   3.99802000e+01])]
    time est de len(time)=3

    avec effectivement 3 arrays .. mais comment accède t on à chacun de ces array?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> time[1]
     
    IndexError: list index out of range

    Merci
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Comme vous ne montrez pas un code complet, ni les erreurs qui vont avec,... et que je fais plus confiance à Python qu'à ce que vous me racontez... si Python dit IndexError sur time[1], c'est que l'objet associé à ce time là n'est pas le même que celui qui dit len(time) == 3.

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

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Oui vous avez raison, j'ai copier coller mon code dans ipython pour des tests sans savoir qu'il ne lisait pas la boucle car ne faisait lire le code ligne par ligne sans jamais revenir.. et par conséquent n'avais qu'une dimension pour time et comme en plus j'ai toujours pas l'habitude de l'incrément commençant par 0.. soit il devait me sortir une réponse, soit me dire que time n’existait pas..

    Peut on copier/coller un bloc d'instruction sur ipython ou ce n'est que commande par commande?
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  13. #13
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Newenda Voir le message
    Peut on copier/coller un bloc d'instruction sur ipython ou ce n'est que commande par commande?
    Suffit de tester.

    Code shell : 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
    27
    28
    29
    30
    splash@splash:~$ ipython3
    Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
    Type "copyright", "credits" or "license" for more information.
     
    IPython 2.3.0 -- An enhanced Interactive Python.
    ?         -> Introduction and overview of IPython's features.
    %quickref -> Quick reference.
    help      -> Python's own help system.
    object?   -> Details about 'object', use 'object??' for extra details.
     
    In [1]: test = 'Eh ipython, je peux coller des blocs de codes dans ta face ?'
     
    In [2]: print(test)
    Eh ipython, je peux coller des blocs de codes dans ta face ?
     
    In [3]: for n in range(10) :
       ...:         print('Oui tu peux !')
       ...:     
    Oui tu peux !
    Oui tu peux !
    Oui tu peux !
    Oui tu peux !
    Oui tu peux !
    Oui tu peux !
    Oui tu peux !
    Oui tu peux !
    Oui tu peux !
    Oui tu peux !
     
    In [4]:

    Il a dit oui
    Le temps ronge l'amour comme l'acide.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Merci Bistouille, exemple très instructif !

    Je réouvre ce post pour essayer d'allez un peu plus loin :

    revoilà mon code qui me permet donc de stacker des fichiers de données ('un nom précis, dans un répertoire précis) dans une list

    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
    27
    #!usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    Model=['89','90','91','92','93','94']
    Receiver=['07','19']
     
    signal=[]
    time=[]
    ampl=[]
     
    colours = ['b','g','r','y','k','c','m']*3
    linestyles=['-']*(len(colours)/3)+['--']*(len(colours)/3)+[':']*(len(colours)/3)
    print colours
    print linestyles
    a=0
    b=len(Model)
    ii=0
    for rec in Receiver:
     for mod in Model:
      path= './%s/tracex0%s' %(mod,rec)
      print path
      signal = np.loadtxt(path)
      time.append(signal[:,0])
      ampl.append(signal[:,1])
     
      plt.plot(time[ii],ampl[ii],color=colours[ii],linestyle=linestyles[ii],label='Model-'+Model[ii])
    Comme vous pouvez le voir, j'essaye maintenant d'ouvrir (enregistrer et ploter) les fichiers suivant les 2 paramètres qui les définis : Model et Receiver et non plus que Model.
    Pour ce faire, je tente de faire une double boucle mais la concaténation est plus complexe pour définir les données (bien que pas impossible).

    Mais j'aimerais savoir si il y avait une autre façon de faire, plus simple et plus logique pour faire ce genre de concaténation en gardant les infos importantes (Model et Receiver) ?

    Merci pour toutes directions ou aides .
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

Discussions similaires

  1. Comment lire et envoyer des données dans un automate
    Par orj30754 dans le forum VB.NET
    Réponses: 3
    Dernier message: 06/09/2007, 13h01
  2. Comment lire et envoyer des données dans un automate
    Par orj30754 dans le forum VB.NET
    Réponses: 0
    Dernier message: 04/09/2007, 12h01
  3. Concaténation des données d'un tableau
    Par SybVicious dans le forum Débuter
    Réponses: 13
    Dernier message: 25/07/2007, 15h05
  4. Réponses: 6
    Dernier message: 09/11/2006, 16h34
  5. lire et ecrire des donnée dans un .ini
    Par gsmdu62 dans le forum Delphi
    Réponses: 6
    Dernier message: 25/05/2006, 03h29

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