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 :

Formater les données pour sauver en ascii [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2011
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 72
    Par défaut Formater les données pour sauver en ascii
    Bonjour à tous,

    Petit problème simple mais qui me fait m'arracher les cheveux :

    J'ai un increment i et j , tout deux allant de 0 à 575.
    J'ai aussi une variable 2D (575x575) contenant des floats.
    Je souhaite sauver tout ça dans ce format :

    0 0 3.44
    1 0 3.22
    2.0 3.39

    En gros : i j valeur

    J'ai ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for j in range(575):
        for i in range(575):
             np.savetxt('file_numpy.txt', (lat[i],lon[j],sumlevel_zoom[i,j]), fmt="%1.4f %1.4f %1.4f\n")
    Or il me dit : ValueError: fmt has wrong number of % formats: %1.4f %1.4f %1.4f

    Malgré la doc je ne parviens pas à rééllement comprendre le fonctionne de ce formatage. Je l'avais pourtant fait sous matlab, et ça fonctionnait très bien avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fprintf(idv, '%f %f %f\n',  [X(i),Y(j) sympreciV(i,j)]);
    Quelqu'un peut m'éclairer?

    En vous remerciant par avance,
    Jonathan

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 740
    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 740
    Par défaut
    Salut,

    Lorsque vous écrivez '%f %f %f' vous dites "écrit moi 3 floats séparés par des blancs" et c'est un format accepté par fprintf en C.
    La vous utilisez numpy.savetxt pour fabriquer un fichier CSV. Le séparateur est à passer dans delimiter="...": inutile de mettre quoi que ce soit dans fmt à ce sujet et fmt va servir à préciser comment écrire les colonnes ou chaque colonne (une séquence de format).
    note: il faut construire votre array avant de le sauvegarder.

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

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2011
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 72
    Par défaut
    Merci pour votre réponse,
    J'ai fait un mesgrid de mes lon et lat, afin d'avoir que des matrices 2D à sauver.

    Maintenant quand j'essaie de les sauvegarder, chaque terme se retrouve à la ligne, et non pas dans le format "lon lat valeur"
    Comme ceci :
    lon
    lat
    valeur
    lon
    lat
    etc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mlon,mlat=np.meshgrid(lonzoom,latzoom)
    f=open('file_numpy.txt','wt')
    "np.shape(sumlevel_zoom)"
    "sumlevel1D = np.reshape(sumlevel_zoom,[])"
    for j in range(575):
        for i in range(575):
             np.savetxt(f, [mlon[i,j],mlat[i,j],sumlevel_zoom[i,j]], delimiter="\t")
    Qu'ai-je mal écris ?

    Merci encore,
    Jonathan

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 740
    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 740
    Par défaut
    Citation Envoyé par yonafunu Voir le message
    Qu'ai-je mal écris ?
    Vous n'avez toujours pas construit d'array de 3 colonnes mais vous voulez quand effectuer 575*575 appels à numpy.savetxt avec une séquence à 3 éléments. Pourquoi ne pas sauvegarder sumlevel_zoom directement?
    Le module csv serait plus approprié.

    Après, vous devez avoir la curiosité de lancer la console Python pour voir ce que fait numpy.savetxt de votre séquence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> numpy.savetxt('x.out', (1,2,3), fmt='%d')
    >>> open('x.out').read()
    '1\n2\n3\n'
    Chaque élément devient ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> numpy.savetxt('x.out', [(1,2,3)], fmt='%d')
    >>> open('x.out').read()
    '1 2 3\n'
    Et là on a une ligne et 3 colonnes.

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

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2011
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 72
    Par défaut
    Merci de votre réponse,
    J'ai entre temps trouvé une solution qui fonctionne...toujours dans une loop
    je parviens maintenant à avoir mes 3 colonnes.
    Seule soucis restant, il s'arrête pas tout à fait à la fin, il manque 20 itérations ! Le fichier se termine ainsi :

    561.000000 575.000000 0.000000
    562.000000 575.000000 0.000000
    563.000000 575.000000 0.000000
    564.000000 575.000000 0.000000
    565.000000 575.000000 0.000000
    566.000000 575.000000 0.000000
    567.000000 575.000000 0

    Plutôt étrange non ?

    Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    f=open('file_numpy.txt','wt')
    for i in range(576):
        for j in range(576):
             llon=int(mlon[i,j])
             llat=int(mlat[i,j])
             lsum=sumlevel_zoom[i,j]
     
             np.savetxt(f, [(llon,llat,lsum)], fmt="%f")

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 740
    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 740
    Par défaut
    Citation Envoyé par yonafunu Voir le message
    Plutôt étrange non ?
    Soit vous avez oublié de fermer le fichier et les dernières écritures sont parties en fumée, soit le fichier de sortie a le bon nombre de lignes mais les données qui sont dans vos tableaux ne sont pas celles que vous croyez....

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

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

Discussions similaires

  1. [CR XI] Filtrer les données pour calcul
    Par babsy dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 12/05/2009, 13h45
  2. Réponses: 0
    Dernier message: 05/05/2008, 11h09
  3. Formater des données pour l'export en txt
    Par opacho dans le forum Langage
    Réponses: 1
    Dernier message: 15/01/2008, 10h21
  4. Réponses: 1
    Dernier message: 29/06/2007, 09h19
  5. Réponses: 4
    Dernier message: 04/12/2003, 08h12

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