Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails) *** mise à jour 12/10/2014 ***

#1 Le 19/02/2013, à 14:06

bmzoom

[RESOLU] Python et liste

bonjour ,

tab1   tab2
2214   62
2215   50
2216   57
2217   67
..
..

J'ai une liste double dans un fichier de 3000 points ( courbe de gauss ) .
En lisant tab1 , tab2 , je veux garder que les maxi sur tab2
et afficher :

( Il y 4 ou 5 maxi parmi 3000 points , mais ils ne sont pas les uns derrière les autres )

print 'REPET MAXI =',tab2,' AVEC LA SOMME DE =',tab1
..

Le fichier de 3000 pt est ici

Dernière modification par bmzoom (Le 19/02/2013, à 23:54)

Hors ligne

#2 Le 19/02/2013, à 14:56

pingouinux

Re : [RESOLU] Python et liste

Bonjour,
Peux-tu montrer le bout de programme que tu as déjà écrit ?

Hors ligne

#3 Le 19/02/2013, à 15:39

bmzoom

Re : [RESOLU] Python et liste

Il faut trouver le max et après les autres de même niveau .
C'est un essai sur 420 valeurs :

#! /usr/bin/env python
# -*- coding: Latin-1 -*-

ofi=open('dt3000','r')

dat=ofi.readline().rstrip('\n\r')
n=len(dat)
n1=dat.find('   ')
dat1=dat[0:n1]
dat2=dat[n1+1:n]
dt1=int(dat1)
dt2=int(dat2)
print dt1,dt2

max2=10;max1=10
mix2='';mix1=''
for i in range (420):
    dat=(ofi.readline().rstrip('\n\r'))
    n=len(dat)
    n1=dat.find('   ')
    dat1=dat[0:n1]
    dat2=dat[n1+1:n]
    dt1=int(dat1)
    dt2=int(dat2)
    print dt1,dt2
    if (dt2>=max2):
        max2=dt2
        mix2 = mix2+' '+dat2
        mix1 = mix1+','+dat1
       
print 'REPET MAXI =',mix2,' AVEC LA SOMME DE =',mix1
ofi.close()

C'est faisable avec 2 passages

562 1430
REPET MAXI = 562  AVEC LA SOMME DE = 1362
REPET MAXI = 562  AVEC LA SOMME DE = 1430
(1430, 1362, 0)
AXE DU CENTRE DE LA GAUSSIENNE :  1396
VALEUR AU CENTRE DE LA GAUSSIENNE :  482

Avec 3 passages

Dernière modification par bmzoom (Le 19/02/2013, à 17:03)

Hors ligne

#4 Le 19/02/2013, à 18:39

pingouinux

Re : [RESOLU] Python et liste

Je n'ai pas bien compris ce que tu essayais de faire, mais ton script peut se simplifier ainsi :

#! /usr/bin/env python
# -*- coding: Latin-1 -*-

max2=10;max1=10
mix2='';mix1=''
with open('dt3000','r') as ofi :

   for dat in ofi.readlines() :
      dat1,dat2 = dat.split()
      dt1=int(dat1)
      dt2=int(dat2)
      print dt1,dt2

      if (dt2>=max2):
          max2=dt2
          mix2 = mix2+' '+dat2
          mix1 = mix1+','+dat1

print 'REPET MAXI =',mix2,' AVEC LA SOMME DE =',mix1

Hors ligne

#5 Le 19/02/2013, à 19:47

bmzoom

Re : [RESOLU] Python et liste

Faut tracer la gaussienne avec gnuplot avec la console
Tu essayeras après de trouver les maxi , l'axe , etc ...

>>> gnuplot  -persist tup.gpl

fichier tup.gpl ci-dessous :
set grid;
set xlabel "Somme";
set ylabel "Répétition";
set terminal png;
set output 'tup.png';
plot 'dt3000'

Hors ligne

#6 Le 19/02/2013, à 20:20

pingouinux

Re : [RESOLU] Python et liste

Pour localiser le maximum de la courbe, mais c'est une méthode assez grossière :

#! /usr/bin/env python
# -*- coding: Latin-1 -*-:

max2=-1
with open('dt3000','r') as ofi :

   for dat in ofi.readlines() :
      dat1,dat2 = dat.split()
      dt1=int(dat1)
      dt2=int(dat2)
#     print dt1,dt2

      if (dt2>max2):
          max2=dt2
          n_max2=1
          mix1 = dt1
      elif (dt2==max2):
          n_max2 += 1
          mix1 = mix1+dt1

print("NB_DE_POINTS_MAX=%d X_MAX=%d => SOMME_Y_MAX=%d MOYENNE_Y_MAX=%.2f"%(n_max2,max2,mix1,mix1/n_max2))

qui donne ce résultat

NB_DE_POINTS_MAX=2 X_MAX=562 => SOMME_Y_MAX=2792 MOYENNE_Y_MAX=1396.00

Hors ligne

#7 Le 19/02/2013, à 22:43

grim7reaper

Re : [RESOLU] Python et liste

Salut,

Je serais toi je passerait par numpy.

from numpy import loadtxt, where

def main():
    data = loadtxt('dt3000')
    tab1 = data[:, 0]
    tab2 = data[:, 1]
    max_idx = where(tab2 == tab2.max())
    for idx in max_idx[0]:
        print('REPET MAXI = {}  AVEC LA SOMME DE = {}'.format(tab2[idx],
                                                              tab1[idx]))

if __name__ == '__main__':
    main()

Donne :

REPET MAXI = 562.0  AVEC LA SOMME DE = 1362.0
REPET MAXI = 562.0  AVEC LA SOMME DE = 1430.0

Hors ligne

#8 Le 19/02/2013, à 23:53

bmzoom

Re : [RESOLU] Python et liste

ok - c'est bien de comparer
moi je passe par des boucles et vous vous sortez des modules ou fonctions
du chapeau ..

Hors ligne

#9 Le 20/02/2013, à 10:27

elendil

Re : [RESOLU] Python et liste

D'ailleurs pour le plot tu peux jeter un œil à Matplotlib plutôt que Gnuplot ce qui te permettra de ne faire qu'un seul script en Python.

Hors ligne

#10 Le 20/02/2013, à 12:47

bmzoom

Re : [RESOLU] Python et liste

ok elendil ..

set grid;
set xlabel "Somme";
set ylabel "Répétition";
set terminal png;
set output 'tup.png';
plot 'dt3000'

Alors converti le graphe vers une fenêtre avec matplolib
En traçant les 2 points au sommet du graphe

MAXI = 562  AVEC LA SOMME DE = 1362
MAXI = 562  AVEC LA SOMME DE = 1430

A+

Hors ligne

#11 Le 20/02/2013, à 14:17

elendil

Re : [RESOLU] Python et liste

J'ai pas très bien compris ce que tu veux dire par :

bmzoom a écrit :

En traçant les 2 points au sommet du graphe

Gnuplot avec ton code donne :
1361362549.png
Python et Matplotlib :
1361362587.png

Le script python en reprenant la méthode donnée par grim7reaper pour les maximums :

#!/usr/bin/env python
#-*-coding: utf8 -*-

import matplotlib.pyplot as plt
import numpy as np

fichier = "dt3000"
output = "tup_python.png"

if __name__ == '__main__':
    ## Lecture du fichier
    data = np.loadtxt(fichier)
    tab1 = data[:, 0]
    tab2 = data[:, 1]

    ## Recherche des indices des maximums
    max_idx = np.where(tab2 == tab2.max())
    for idx in max_idx[0]:
        print('REPET MAXI = {}  AVEC LA SOMME DE = {}'.format(tab2[idx], tab1[idx]))

    ## Plot
    fig = plt.figure()
    plt.plot(tab1, tab2, 'r+', label=fichier)
    plt.grid()
    plt.legend(numpoints=1, frameon=False)
    plt.xlabel("Somme")
    #plt.ylim(ymax=tab2[max_idx[0][0]]) ## Si décommentée force l'affichage de la courbe en haut du graphique
    plt.ylabel("Répétition".decode('utf-8')) #decode est une astuce pour pouvoir utiliser des caractères accentués
    plt.savefig(output, bbox_inches='tight')
    #plt.show() ## Pour afficher le résultat avec Matplotlib

Dernière modification par elendil (Le 20/02/2013, à 14:21)

Hors ligne

#12 Le 20/02/2013, à 16:48

bmzoom

Re : [RESOLU] Python et liste

Comme tu peux le voir le haut de la gaussienne n'est pas pointu
Il y a 2 maxi en x1=1362 et x2=1430 ( pour ymax=562 )
L'axe est le milieu de (1430,1362) ou AXE DU CENTRE DE LA GAUSSIENNE :  1396

Avec matplotlib , peut tu ajouter , après calcul ces  informations dans le graphe
Tout en 1 , c'est :
- graphe => sortie 1
- calcul
- information + graphe => sortie 2

Hors ligne

#13 Le 20/02/2013, à 17:22

elendil

Re : [RESOLU] Python et liste

J'ai ajouté une droite à l'endroit que tu appelles "axe de la gaussienne" avec sa valeur en haut du graphique.
Voilà ce que ça donne :
1361373634.png

Le code :

#!/usr/bin/env python
#-*-coding: utf8 -*-

import matplotlib.pyplot as plt
import matplotlib.transforms as transforms
import numpy as np

fichier = "dt3000"
output = "tup_python.png"

if __name__ == '__main__':
    ## Lecture du fichier
    data = np.loadtxt(fichier)
    tab1 = data[:, 0]
    tab2 = data[:, 1]

    ## Recherche des indices des maximums
    max_idx = np.where(tab2 == tab2.max())
    for idx in max_idx[0]:
        print('REPET MAXI = {}  AVEC LA SOMME DE = {}'.format(tab2[idx], tab1[idx]))
    axe_gaussienne = np.sum(tab1[max_idx[0]])/2.
    print('Axe de la gaussienne: %s'%(axe_gaussienne))

    ## Figure
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ## Transformation
    trans = transforms.blended_transform_factory(ax.transData, ax.transAxes)
    ## Plot
    plt.plot(tab1, tab2, 'r+', label=fichier)
    ## Grille et légende
    plt.grid()
    plt.legend(numpoints=1, frameon=False)
    ## Ligne verticale et texte
    plt.axvline(x=axe_gaussienne, color='k', linewidth=1.5)
    plt.text(axe_gaussienne, 1.01, "%g"%(axe_gaussienne), transform=trans, horizontalalignment='center')
    ## Légende des axes
    plt.xlabel("Somme")
    plt.ylabel("Répétition".decode('utf-8')) #decode est une astuce pour pouvoir utiliser des caractères accentués
    ## Sauvegarde et affichage
    plt.savefig(output, bbox_inches='tight')
    plt.show()

Dernière modification par elendil (Le 20/02/2013, à 17:23)

Hors ligne

#14 Le 20/02/2013, à 17:29

bmzoom

Re : [RESOLU] Python et liste

Tout en 1 , c'est :
- graphe => sortie png_1
- calcul ( qq résultats )  => sortie png_2
- information + graphe => sortie png_3

Est ce que tu peux sortir 3 png différents avec le même script python  ?

Je n'en suis pas encore là , mais intégrer du code latex dans png_2 , est ce faisable ?

Dernière modification par bmzoom (Le 20/02/2013, à 17:31)

Hors ligne

#15 Le 20/02/2013, à 17:43

grim7reaper

Re : [RESOLU] Python et liste

Tu veux pas non plus 100 balles et 1 mars ?

Excuse-moi, mais je trouve ton attitude plutôt moyenne.
Tu demandes pas mal de truc, mais pas un seul merci ou s’il vous plaît depuis le début.
Et on ne te vois pas trop essayer de faire quoi que ce soit par toi-même.
Jpense que tu as déjà pas mal de piste, t’as plus qu’a te sortir les doigts et revenir si tu rencontres un problème.

Enfin, c’est mon humble avis.

Hors ligne

#16 Le 20/02/2013, à 17:44

elendil

Re : [RESOLU] Python et liste

grim7reaper a écrit :

Tu veux pas non plus 100 balles et 1 mars ?

Excuse-moi, mais je trouve ton attitude plutôt moyenne.
Tu demandes pas mal de truc, mais pas un seul merci ou s’il vous plaît depuis le début.
Et on ne te vois pas trop essayer de faire quoi que ce soit par toi-même.
Jpense que tu as déjà pas mal de piste, t’as plus qu’a te sortir les doigts et revenir si tu rencontres un problème.

Enfin, c’est mon humble avis.

Même avis ! Mais déjà dit ici au post #8 : http://forum.ubuntu-fr.org/viewtopic.php?id=1195131

Oui on peut toujours faire tout ce que l'on veut avec Python. big_smile

Le code que je t'ai donné est une bonne base.
Il n'est pas très compliqué et tu dois pouvoir le modifier à ta guise pour faire ce que tu veux avec.
Et oui tu peux faire 3 graphiques avec le même script. En fait tu en fait autant que tu veux.

Et oui tu peux ajouter du code LaTeX dans tes graphiques.
Par exemple pour la légende de l'axe X :

plt.xlabel(r"$\mathrm{Surface\ =} 4\pir^{2}$")

Jettes un oeil à la documentation de Matplotlib : http://matplotlib.org/index.html
Pour le LaTeX : http://matplotlib.org/users/usetex.html

Dernière modification par elendil (Le 20/02/2013, à 17:48)

Hors ligne

#17 Le 20/02/2013, à 17:56

bmzoom

Re : [RESOLU] Python et liste

Enfin, c’est mon humble avis.

Non ,  c'est pas l'avis d'un humble , mais d'un naze qui veut jouer

---------

Ça , c'est de l'humilité

Est ce que tu peux sortir 3 png différents avec le même script python  ?
Je n'en suis pas encore là , mais intégrer du code latex dans png_2 , est ce faisable ?

Hors ligne

#18 Le 20/02/2013, à 17:57

grim7reaper

Re : [RESOLU] Python et liste

Ok, je vois le genre…
À l’avenir j’éviterais tes sujets smile

Bon vent.

Hors ligne

#19 Le 20/02/2013, à 17:59

bmzoom

Re : [RESOLU] Python et liste

Exact , voit d'abord , à qui tu veux montrer ta science
Casse toi , tu pue !

Hors ligne

#20 Le 20/02/2013, à 18:09

elendil

Re : [RESOLU] Python et liste

grim7reaper a écrit :

Ok, je vois le genre…
À l’avenir j’éviterais tes sujets smile
Bon vent.

Idem !
Une fois ne m'a pas servi de leçon mais là j'ai compris !

@bmzoom
Je jette l'éponge devant tant d'impolitesse et de mauvaise volonté de ta part.

Hors ligne

#21 Le 20/02/2013, à 18:12

bmzoom

Re : [RESOLU] Python et liste

Le modérateur jugera qui vient casser les pieds
Qui est celui qui n'est pas correct

Hors ligne

#22 Le 20/02/2013, à 18:25

nesthib

Re : [RESOLU] Python et liste

@grim7reaper : un peu de tact, même si tu as raison sur le fond.

@bmzoom : on se calme, je te rappelle que ce sont des bénévoles qui te répondent, et effectivement un « merci » de temps en temps ne fait pas de mal. Quant à en venir à l'agression ceci ne sera pas toléré. Considère-le comme un avertissement.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#23 Le 20/02/2013, à 18:45

bmzoom

Re : [RESOLU] Python et liste

Le bénévolat est une activité non rétribuée et librement choisie qui s’exerce en général au sein d’une institution sans but lucratif (ISBL) : association, ONG, syndicat ou structure publique. Celui ou celle qui s’adonne au bénévolat est appelé « bénévole ». L’étymologie du mot vient du latin « benevolus » qui signifie « bonne volonté ».

Le mec qui dis , à un autre , maintenant cela suffit , " n'est pas un bénévole "

Hors ligne

#24 Le 20/02/2013, à 18:53

nesthib

Re : [RESOLU] Python et liste

@bmzoom : je ne suis pas d'accord et de toute façon cela ne change rien au problème, maintenant je te renvoie vers les règles du forum, si tu n'es pas d'accord avec la décision de modération → mailto:moderateurs [at] ubuntu-fr [point] org


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#25 Le 20/02/2013, à 18:58

bmzoom

Re : [RESOLU] Python et liste

Un prêtre-modérateur est un prêtre en charge d'une équipe pastorale
Un couvent modérateur est en charge de modératrices

Hors ligne

Haut de page ↑