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 :

Mauvaise dimension de listes


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    Mauvaise dimension de listes
    Bonjour,

    Je débute avec Python, la réponse à ma question est peut-être triviale.

    J'ai un morceau de code:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    A=0
    B=[]
    for i in range(VAL1):
        for j in range(VAL1):
            P=0
            for k in range(VAL2):
                P = P + 2*(df[i][k]*df[j][k])
            if i != j:
                P = 2*P
            A=A+1
            B[A] = B.append(P)
    Atot=A


    VAL1 va de 0 à 3 dans mon DataFrame (dim 1x4)
    VAL2 va de 0 à 9 " " " " " " (dim 1x10)

    J'ai deux erreurs différentes:
    Pour la ligne
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     P = P + 2*(df[i][k]*df[j][k])

    j'ai un dépassement : il me dit que "10" n'existe pas dans df, effectivement, ça s'arrête à 9. Pourquoi veut-il aller de 0 à 10? Il ne devrait pas s'arrêter à 9?

    Et pour la ligne
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     B[A] = B.append(P)

    le message d'erreur me dit "out of range". Mais pourquoi? Je n'ai pas donné de limite à B pourquoi est-ce qu'il bloque?

    Aux personnes qui pourront m'aider à comprendre... Merci!

  2. #2
    Membre expérimenté
    Des "print" judicieusement placés devraient pouvoir donner une indication de ce qui se passe.
    Pas d'aide par mp.

  3. #3
    Expert éminent sénior
    Citation Envoyé par liliestidine Voir le message
    j'ai un dépassement : il me dit que "10" n'existe pas dans df, effectivement, ça s'arrête à 9. Pourquoi veut-il aller de 0 à 10? Il ne devrait pas s'arrêter à 9?
    Les valeurs prises par i, j, k sont produites par range(VAL1), range(VAL2).
    A vous de vérifier (avec un print) que VAL1 et VAL2 sont bien plus petits que...

    Citation Envoyé par liliestidine Voir le message
    Et pour la ligne
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     B[A] = B.append(P)

    le message d'erreur me dit "out of range". Mais pourquoi? Je n'ai pas donné de limite à B pourquoi est-ce qu'il bloque?
    Parce que vous n'avez pas passé assez de temps pour comprendre comment fonctionnent les listes avec Python et que vous écrivez du code sans trop réfléchir. Lancez la console Python et créez un B:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    >>> B = []

    B est une liste vide.
    Et si elle est vide l'accès à un élément via son index va planter:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> B[0]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list index out of range
    >>> B[1]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list index out of range


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

  4. #4
    Candidat au Club
    Citation Envoyé par marco056 Voir le message
    Des "print" judicieusement placés devraient pouvoir donner une indication de ce qui se passe.
    Merci pour la réponse.
    Avant de rajouter " P = P ...." j'avais mis des 'print' un peu partout histoire de voir ce qu'il se passait.
    Tout s'affiche bien .... jusqu'à la dernière valeur (forcément puisqu'elle n'existe pas). Je me retrouve avec un 'Keyerror : 10".

  5. #5
    Candidat au Club
    Citation Envoyé par wiztricks Voir le message
    Les valeurs prises par i, j, k sont produites par range(VAL1), range(VAL2).
    A vous de vérifier (avec un print) que VAL1 et VAL2 sont bien plus petits que...
    Merci pour la réponse.
    C'est déjà vérifié. Ca commence bien à 0 et ça va bien jusqu'à 3 c'est pour cela que je ne comprends pas d'où sort ce '4'.

    [OUT] :
    VAL1 = 0 CALCUL = 4.667451043185921e-10
    VAL1 = 1 CALCUL = 1.342852708629632e-09
    VAL1 = 2 CALCUL = 1.7404738040985681e-09
    VAL1 = 3 CALCUL = 3.142938906063392e-09

    (...)

    KeyError: 4

    Surtout que du coup, mes 4 valeurs sont correctement calculées.



    Citation Envoyé par wiztricks Voir le message
    Parce que vous n'avez pas passé assez de temps pour comprendre comment fonctionnent les listes avec Python et que vous écrivez du code sans trop réfléchir. Lancez la console Python et créez un B:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    >>> B = []

    B est une liste vide.
    Et si elle est vide l'accès à un élément via son index va planter:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> B[0]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list index out of range
    >>> B[1]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: list index out of range


    - W
    Effectivement, on m'a plongée dans Python alors que je ne connais pas vraiment, je suis plus habituée au Fortran et j'ai du mal avec la synthaxe donc je fais un peu comme je peux. Il faut donc que je déclare ma matrice avec les bonnes dimensions, en la remplissant de zéros par exemple et y additionner au fur et à mesure ce que je vais calculer à chaque itération? Je ne savais pas qu'il fallait déclarer avec les dimensions, je pensais qu'on pouvait remplir au fur et à mesure comme on voulait vu que c'était vide. Je note.

  6. #6
    Candidat au Club
    Oui alors pardon, VAL1 et VAL2 ont été inversées de nombreuses fois, un coup je dis "10" un coup "4" mais en fait dans un sens ou dans un autre le problème reste le même.

  7. #7
    Candidat au Club
    Problème résolu. Une variable était mal actualisée sur Jupyter Notebook.

###raw>template_hook.ano_emploi###