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

Calcul scientifique Python Discussion :

[debutant] Transfert de donnees et calcul à partir d'une liste


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 4
    Points
    4
    Par défaut [debutant] Transfert de donnees et calcul à partir d'une liste
    Bonjour, j'aurais besoin d'un peu d'aide sur un problème sans doute un peu nul.
    Il y a deux choses:
    - la première c'est que je n'arrive pas à réaliser un calcul à partir d'une valeur d'une liste (ligne 39) déterminée avant
    - la deuxième chose est que je voudrais stocker les données calculées Pcum et stockage dans un fichier externe mais n'ai aucune idée de comment faire.
    Voila mon programme:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    import csv
    import matplotlib.pyplot as plt
    import numpy as np
    from scipy.integrate import quad
     
    energie = [] #creation des listes
    angle = []
    section = []
    Pcum = []
    stockage = []
     
    fichier = csv.reader(open("donnees-energie5.csv","r"))
    fichier2 = open("stockage2.txt","a")
     
    for row in fichier: #transferts des donnees dans les listes
        energie.append(row[0])
        angle.append(row[1])
        section.append(row[2])
     
    plt.plot(angle,section)
     
    i = 0
    C = 0
     
    angle = [float(x) for x in angle] #transformation en reels
    section = [float(y) for y in section]
     
    def fonction(x,y): #fonction a integrer
        return np.sin(x)*y
     
    x = angle[i]
    y = section [i]
     
    while C<10: #integration pour toutes les valeurs
        I = quad(fonction,0,angle[i],args=(y))
        stockage.insert(i,I)
        C = C+1
        i = i+1
        Pcum[i] = stockage[i]*2*np.pi

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Je suppose que tu as une erreur "out of range".

    Le nom i est simplement un index et tu l'incrémentes avant d'utiliser la valeur à cet index, qui n'existe pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        stockage.insert(i,I)
        C = C+1
        i = i+1
        Pcum[i] = stockage[i]*2*np.pi
    Ton code devrait se résumer à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while C < 10:
        I = quad(fonction,0,angle[i],args=(y))
        stockage.append(I)
        Pcum.append(stockage[-1]*2*np.pi)
        C = C+1

  3. #3
    Membre émérite

    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
    Points : 2 328
    Points
    2 328
    Par défaut
    Pour écrire un tableau numpy dans un fichier tu peux te servir de np.savetxt(filename)

    https://docs.scipy.org/doc/numpy-1.1...y.savetxt.html

    et il est réimportable avec la commande np.loadtxt(filename)

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup pour ta réponse, c'était bien ça mais impossible de trouver l'erreur tout seul.
    Pourrais juste tu m'aider pour le second point qui est l'écriture dans un autre fichier.
    Je voudrais copier la liste stockage dans un fichier txt mais je n'y arrive pas, python me répond que il ne peux pas transférer une liste en écriture (c'est peut-être pas très claire je peux me réexpliquer).

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    En fait j'ai toujours le même problème : can't multiply sequence by non-int of type 'float' pour le calcul de Pcum. Et le coup de l'index qui ne marche pas c'est parce que j'utilisais l'index après l'avoir changé c'est ca ?
    Tu aurais pas un exemple pour la fonction savetesxt parce que j'avoue que pour un débutant je ne comprend pas ce que dit la doc.

  6. #6
    Membre émérite

    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
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par myaxto Voir le message
    En fait j'ai toujours le même problème : can't multiply sequence by non-int of type 'float' pour le calcul de Pcum. Et le coup de l'index qui ne marche pas c'est parce que j'utilisais l'index après l'avoir changé c'est ca ?
    Tu aurais pas un exemple pour la fonction savetesxt parce que j'avoue que pour un débutant je ne comprend pas ce que dit la doc.
    Il y a un exemple au bas du lien que je t'ai donné ...

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Il y a un exemple au bas du lien que je t'ai donné ...
    J'ai bien vu l'exemple mais j'ai toujours le problçme qu'il me faudrait les écrire en colonne et que je n'arrive seulement à le faire en ligne.
    Voila le petit test de programme que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import numpy as np
    M = np.array([[4,7,2,9,1,3,2,7,1]])
    print(M)
    np.savetxt('test.txt',M, fmt='%10.5f',newline='\n',)

    Et avec ce programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while C<10: #integration pour toutes les valeurs
        I = quad(fonction,0,angle[i],args=(y))
        stockage.append(I)
        Pcum.append(stockage[i]*2*np.pi)
        C = C+1
        i = i+1
    J'obtient toujours la même erreur. De plus pourquoi ce n'est pas stockage[i] dans ton changement ?
    Merci pour ta patience et très réponses précédentes.

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    En fait j'aurais pu simplifier encore le code que je t'ai montré.

    Remplace ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    i = 0
    C = 0
    ...
    x = angle[i]
    y = section [i]
     
    while C<10: #integration pour toutes les valeurs
        I = quad(fonction,0,angle[i],args=(y))
        stockage.insert(i,I)
        C = C+1
        i = i+1
        Pcum[i] = stockage[i]*2*np.pi
    par ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    x = angle[0]
    y = section[0]
    for i in range(10):
        I = quad(fonction, 0, angle[i], args=(y))
        stockage.append(I)
        Pcum.append(I*2*np.pi)

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Ce programme marche bien lorsque j'essaye avec une valeur de I du type I=I+4 mais dans mon cas avec I qui est une liste j’obtiens toujours une erreur du type : can't multiply sequence by non-int of type 'float'.
    J'ai testé ça pour palier au problème mais aucun effet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def calcul(z): #fonction pour la proba
        return np.pi*2*z
     
    stockage = [float(z) for z in stockage] 
     
    for i in range(10):
        I = quad(fonction, 0, angle[i], args=(y)) #integration
        stockage.append(I)
        Pcum.append(calcul(stockage[i]))  #calcul de la proba cum
        print(Pcum)

  10. #10
    Membre émérite

    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
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par myaxto Voir le message
    J'ai bien vu l'exemple mais j'ai toujours le problçme qu'il me faudrait les écrire en colonne et que je n'arrive seulement à le faire en ligne.
    Voila le petit test de programme que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import numpy as np
    M = np.array([[4,7,2,9,1,3,2,7,1]])
    print(M)
    np.savetxt('test.txt',M, fmt='%10.5f',newline='\n',)
    Et pourquoi M serait une matrice à 2 dimensions ? Là vous avez une liste qui contient elle même un seul élément qui est lui même une liste (en l'occurrence [4,7,2,9,1,3,2,7,1]). Avec une matrice à une seul dimension, ca fonctionne très bien, le résultat dans le fichier se trouve bien en colonne.

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Et pourquoi M serait une matrice à 2 dimensions ?
    Je ne pensais pas avoir fait une matrice à 2 dimensions ... Mais du coup je ne comprend pas pourquoi ma matrice M n'est pas que à 1 dimension.
    Mais dans mon cas je veux transférer une liste ou pour chaque item j'ai (XXXXX,XXXX) donc je voudrais 2 colonnes.
    Voici le code complet:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    import csv
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.integrate import quad
     
    energie = [] #creation des listes
    angle = []
    section = []
    Pcum = []
    stockage = []
    calcul = []
     
    fichier = csv.reader(open("donnees-energie5.csv","r"))
    fichier2 = open("stockage2.txt","a")
     
    for row in fichier: #transferts des donnees dans les listes
        energie.append(row[0])
        angle.append(row[1])
        section.append(row[2])
     
    plt.plot(angle,section) #affichage section = f(angle)
     
    angle = [float(x) for x in angle] #transformations en reels
    section = [float(y) for y in section]
     
    def fonction(x,y): #fonction a integrer
        return np.sin(x)*y
     
    x = angle[0]  #variables pour la fonction
    y = section [0]
    i = 0
    b = 0
    tempo = 0
    for i in range(1800):
        I = quad(fonction, 0, angle[i], args=(y)) #integration
        stockage.append(I)
     
    stockage = [float(z) for z in section] #transformation en reel
     
    for b in range(1800): #addition des proba
        tempo = (stockage[b]+tempo)
        calcul.append(tempo)
     
    plt.plot(angle,calcul)    #affichage proba cumulee

  12. #12
    Membre émérite

    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
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par myaxto Voir le message
    Je ne pensais pas avoir fait une matrice à 2 dimensions ... Mais du coup je ne comprend pas pourquoi ma matrice M n'est pas que à 1 dimension.
    Suffit de regarder le nombre de crochet imbriqué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A1=np.array([1,2,3])
    print(A1.shape)
    A2=np.array([[1,2,3]])
    print(A2.shape)
    Citation Envoyé par myaxto Voir le message
    Mais dans mon cas je veux transférer une liste ou pour chaque item j'ai (XXXXX,XXXX) donc je voudrais 2 colonnes.
    Donc là en effet tu aurais bien une matrice. Mais dans ce cas si les lignes sont en colonne et vice verca alors il suffit de la transposer (avec np.transpose(la_matrice)) avant de faire la sortie toute simple.


    Après si je regarde le code, comme vous ne savez pas trop comment manipuler vos listes entre elles, le plus facile (et qui est mieux à faire quand on bosse avec numpy) ca serait de procéder un peu dans l'autre sens. C'est à dire qu'aulieu de chercher à créer plein de petit bout d'informations qu'ensuite vous essayer d'assembler dans un seul et même gros bloc, et bien faites l'inverse ! Créer d'abord votre bloc (disons une matrice, remplie de zéros, avec déjà 2 colonnes et le nombre de lignes qu'il vous faut)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data = np.zeros((1800,2))
    Ensuite remplisser le, en itérant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in range(1800):
         data[i,0] = ### blabla, le nombre qu'il faut dans la premiere colonne
         data[i,1] = ### blabla, l'autre nombre qu'il faut dans la deuxieme colonne
    Là en plus ca vous garanti que vous n'aurez pas de problème de dépassement de tableau (type IndexError), et vous aurez juste à sortir votre matrice dans un fichier de manière tout con :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    np.savetxt('sortie.txt',data)

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2018
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je pense avoir enfin trouvé un programme qui marche. Merci à vous pour toutes vos réponses et votre patience.
    Je poste mon programme içi si jamais ca peut servir à quelqu'un sachant que j'ai finalement réalisée l'intégration par une méthode des rectangles basiques.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    import csv
    import numpy as np
    import matplotlib.pyplot as plt
     
    fichier = csv.reader(open("donnees-energie5.csv","r"))
    xmin = 0
    xmax = np.pi
    nbx = 1800
    nbi = nbx - 1 # nombre d'intervalles
    section = [] #creation des listes
    angle = []
    stockage = []
     
    data = np.zeros((1800,2)) #matrice de transfert
     
    for row in fichier: #transferts des donnees dans les listes
        angle.append(row[1])
        section.append(row[2])
     
    section = [float(z) for z in section]   #convertion en reels 
     
    x = np.linspace(xmin, xmax, nbx)
    y = 2*np.sin(x)
    z = section[0]
    """
    plt.plot(x,y)
    """
    integrale = 0
    for i in range(nbi):#methode des rectangles
        integrale = integrale + (x[i+1]-x[i])*y[i]*abs(section[i])
        stockage.append(integrale)
     
    print("integrale =", integrale)
     
    for a in range(nbi):
        data[a,0] = angle[a]
        data[a,1] = stockage[a]
     
    np.savetxt('transfert.odt',data, fmt='%10.5f')

  14. #14
    Membre émérite

    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
    Points : 2 328
    Points
    2 328
    Par défaut
    Voilà qui est bien mieux comme code !

    Quelque piste pour améliorer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    section = []
    for row in fichier:
        section.append(row[2])
     
    section = [float(z) for z in section]   #convertion en reels
    autant mettre dans section le bon truc du premier coup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    section = []
    for row in fichier:
        section.append(float(row[2]))
    Dans tes tableaux/listes il n'y a que des nombres. Donc faire des array numpy partout serait plus adapté que des listes.

    Pour ca il faut réécrire le code en se passant du append. Dans un premier temps.
    Exemple pour stockage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    stockage=[]
    integrale = 0
    for i in range(nbi):#methode des rectangles
        integrale = integrale + (x[i+1]-x[i])*y[i]*abs(section[i])
        stockage.append(integrale)
    peut devenir sans le mot clé append :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    stockage=[0]*nbi ### On lui donne directment la bonne dimension
    integrale = 0
    for i in range(nbi):#methode des rectangles
        integrale = integrale + (x[i+1]-x[i])*y[i]*abs(section[i])
        stockage[i]=integrale
    et puis ensuite avec nupy ca tombe tout seul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    stockage=np.zeros((nbi,)) ### On lui donne directment la bonne dimension
    integrale = 0
    for i in range(nbi):#methode des rectangles
        integrale = integrale + (x[i+1]-x[i])*y[i]*abs(section[i])
        stockage[i]=integrale
    Et ensuite on peut encore aller bien plus loin car il existe dans numpy déjà :
    - une fonction pour faire des sommes et des sommes cumulées d'array
    - on peut faire des opérations mathématiques directement sur des array, donc par exemple si x,y et section étaient des arrays, on pourrait faire directement, sans boucle for et avec les notations slicée (fondamentale de numpy) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (x[1:]-x[:-1])*y*np.abs(section)
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i .... :
       (x[i+1]-x[i])*y[i]*abs(section[i])

Discussions similaires

  1. [AC-2007] Calcul à partir d'une liste déroulante à choix multiples
    Par MatAllwhite dans le forum IHM
    Réponses: 13
    Dernier message: 19/06/2013, 10h22
  2. [XL-2007] Mettre à jour une feuille de calcul à partir d'une autre.
    Par ziad.shady dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/01/2010, 18h24
  3. [MySQL] Affichage d'un résultat calculé à partir d'une bd
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 31/01/2006, 16h40
  4. Calcul à partir d'une table
    Par Didi17 dans le forum Access
    Réponses: 1
    Dernier message: 28/10/2005, 08h37
  5. Réponses: 2
    Dernier message: 03/10/2005, 10h09

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