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 :

Erreur dans une fonction


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2023
    Messages : 2
    Par défaut Erreur dans une fonction
    Bonjour à tous,

    J'essaie de faire une représentation graphique 2d d'un calcul. Pour cela j'utilise une fonction f pour répartir correctement les points sur mon graphique. Ci-dessous la fonction en question (elle n'est pas entière car il y a beaucoup de cas mais c'est pour donner une idée de la forme). Or, lorsque j'essaie d'utiliser cette fonction avec contourf par exemple, j'ai le message d'erreur suivant : if y[j] == 0 and x[i] >= 0 and x[i] <= (N+1)*h : ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all().
    Le problème est que ni la fonction any() ni la fonction all() ne peuvent m'aider dans ce cas là et d'ailleurs je ne comprends pas comment il suppose que y[j] est une liste de plusieurs éléments alors que c'est censé être justement un unique élément.

    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
    def f(x,y):
        for i in range(N+2) :
            for j in range(N+2) :
                if y[j] == 0 and x[i] >= 0 and x[i] <= (N+1)*h :
                    return Beta
                elif y[j] == (N+1)*h and x[i] >= 0 and x[i] <= (N+1)*h :
                    return Alpha
                elif x[i] == 0 and y[j] >= 0 and y[j] <= (N+1)*h :
                    return Alpha
                elif x[i] == (N+1)*h and y[j] >= 0 and y[j] <= (N+1)*h :
                    return Alpha
     
    pas = 12
    x = np.linspace(0,(N+1)*h,pas)
    y = np.linspace(0,(N+1)*h,pas)
    X,Y = np.meshgrid(x,y)
     
    Contour = plt.contourf(X, Y, f(X,Y))
    plt.axis('scaled')
    plt.colorbar()
    plt.show()
    J'ai vu des exemples pour tracer un graphique avec des codes du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def f(x,y): return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)
     
    n = 256
    x = np.linspace(-3,3,n)
    y = np.linspace(-3,3,n)
    X,Y = np.meshgrid(x,y)
     
    contourf(X, Y, f(X,Y), 8, alpha=.75, cmap='jet')
    C = contour(X, Y, f(X,Y), 8, colors='black', linewidth=.5)
    show()
    Or, dans mon cas, ma fonction n'est pas une expression analytique toute faite comme dans l'exemple ci-dessus. Selon x et y, j'ai des cas différents et j'ai l'impression que les conditions sur if ne plaisent pas trop. Ainsi, je n'ai aucune idée de comment réussir à résoudre le problème.
    En quoi avoir plusieurs cas dans ma fonction est un problème ?

    Merci d'avance !

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par SupernovaeB Voir le message
    et d'ailleurs je ne comprends pas comment il suppose que y[j] est une liste de plusieurs éléments alors que c'est censé être justement un unique élément.
    Mauvaise analyse. Tu n'as pas à te demander comment il suppose que y[j] est une liste ; Python ne suppose rien, il ne fait que traiter ce que tu lui passes. Donc tu dois te demander pourquoi c'est une liste alors que ça ne devrait pas en être une. Ce n'est pas ton code qui te contrôle mais à toi de contrôler ton code.
    De là tu remontes à l'appel de f() et tu regardes ce que sont ce X et Y que tu lui passes en paramètre.

    Accessoirement utiliser des variables globales (N, Alpha, Beta) c'est tout sauf lisible et portable, bref tout sauf propre.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par SupernovaeB Voir le message
    et d'ailleurs je ne comprends pas comment il suppose que y[j] est une liste de plusieurs éléments alors que c'est censé être justement un unique élément.
    Les X, Y passé a votre fonction sortent du np.meshgrid(x,y) à la ligne 14.
    A défaut de lire/comprendre la documentation de np.meshgrid, vous pouvez afficher le contenu de X et de Y pour constater qu'il s'agit de tableaux à 2 dimensions.
    Ce n'est peut être pas ce que vous attendiez mais c'est ce que Python récupère, d'où le message d'erreur.

    note: les exemples (qui marchent) de fonctions s'appliquent a tout le tableau et non à chacun des éléments.

    Citation Envoyé par SupernovaeB Voir le message
    En quoi avoir plusieurs cas dans ma fonction est un problème ?
    Vous avez 2 points importants dans les fonctions: les paramètres attendus et ce que ça retourne. Vos exemples retournent des tableaux.... et si la fonction doit construire un tableaux à partir d'autres tableaux... il n'est pas interdit d'avoir plusieurs cas mais il faudra respecter l'interface.


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

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    Quand tu passes les tableaux X et Y à ta fonction f, tu essaies de faire des opérations de comparaison (==, >=, <=) entre des scalaires et des tableaux, ce qui n'est pas directement possible avec NumPy.

    Dans NumPy, lorsqu'une opération est effectuée entre un tableau et un scalaire, l'opération est appliquée à chaque élément du tableau. Ainsi, l'expression y[j] == 0 est évaluée pour chaque élément du tableau y[j], résultant en un tableau de valeurs booléennes.

    Pour résoudre ce problème, tu dois repenser la logique de ta fonction f pour qu'elle puisse traiter des tableaux au lieu de scalaires.

Discussions similaires

  1. erreur dans une fonction
    Par nicerico dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/10/2006, 11h02
  2. Trouver l'erreur dans une fonction
    Par Seth77 dans le forum Langage
    Réponses: 4
    Dernier message: 28/06/2006, 16h38
  3. [débutant] erreur dans une fonction
    Par Skizo dans le forum Access
    Réponses: 7
    Dernier message: 18/05/2006, 10h46
  4. Erreur dans une fonction
    Par dark_vidor dans le forum Langage
    Réponses: 6
    Dernier message: 15/01/2006, 10h23
  5. Réponses: 2
    Dernier message: 11/08/2004, 15h01

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