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 :

Problème avec numpy.ndarray


Sujet :

Calcul scientifique Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 52
    Points
    52
    Par défaut Problème avec numpy.ndarray
    Bonjour,

    je suis actuellement bloqué dans l'écriture de mon code. Le but est de modéliser le problème de MOnty Hall en n'utilisant que la bibliothèque numpy et sans avoir recours à la boucle for. Pour cela :

    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
     
    %matplotlib inline
     
    import numpy as np
    import matplotlib.pyplot as plt
    from enum import Enum
     
    class Strategie(Enum):
        GARDER = 0
        CHANGER = 1
     
    def play():
        """Simulation du jeu de Monty Hall"""
     
        results = np.array([])
     
        # Portes disponibles au début du jeu
        doors = np.array([1, 2, 3])
     
        # Porte où se cache la voiture
        car = np.random.randint(1,4,1)
     
        # Porte choisie par le candidat
        choice = np.random.randint(1,4,1)
     
        # Portes que le présentateur peut ouvrir
        open_doors = np.setdiff1d(doors,[car, choice])
     
        # Porte ouverte par le présentateur
        open_door = np.random.choice(open_doors, 1)
     
        # Porte qui reste fermée après l'ouverture du présentateur
        other_closed_door = np.setdiff1d(doors, [choice, open_door])
     
        if other_closed_door == car:
            results = np.append(results, 1)
        else:
            results = np.append(results, 0)
     
        return results
    Le terme results à la fin me retourne un nd.array avec la valeur 0 ou 1 suivant le bon choix de porte. Je voudrais que réaliser cette tâche plusieurs fois. En cherchant sur ce forum, j'ai trouvé une piste avec la fonction fromfunction mais lorsque je l'utilise de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    liste = np.vectorize(play(Strategie.Garder))
    result = np.fromfunction(liste, (100,), dtype = int)
    Cela renvoie numpy.array not callable alors qu'avec le code suivant cela marche :

    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
     
    %matplotlib inline
     
    import numpy as np
    import matplotlib.pyplot as plt
    from enum import Enum
     
    class Strategie(Enum):
        GARDER = 0
        CHANGER = 1
     
    def play(nbtous):
        """Simulation du jeu de Monty Hall"""
     
        results = np.array([])
     
        # Portes disponibles au début du jeu
        doors = np.array([1, 2, 3])
     
        # Porte où se cache la voiture
        car = np.random.randint(1,4,1)
     
        # Porte choisie par le candidat
        choice = np.random.randint(1,4,1)
     
        # Portes que le présentateur peut ouvrir
        open_doors = np.setdiff1d(doors,[car, choice])
     
        # Porte ouverte par le présentateur
        open_door = np.random.choice(open_doors, 1)
     
        # Porte qui reste fermée après l'ouverture du présentateur
        other_closed_door = np.setdiff1d(doors, [choice, open_door])
     
        if other_closed_door == car:
            results = np.append(results, 1)
        else:
            results = np.append(results, 0)
     
        return results
     
    liste = np.fromfunction(np.vectorize(play), (100,), dtype=int)
    1 - Pourquoi dois-je passer un argument à play dans le second cas ?
    2 - Pourquoi cela ne marche pas dans le premier cas ?

    Merci d'avance pour vos piste et vos éclaircissements. Comme vous l'avez compris je début sous numpy...

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par beckhton Voir le message
    1 - Pourquoi dois-je passer un argument à play dans le second cas ?
    2 - Pourquoi cela ne marche pas dans le premier cas ?

    Merci d'avance pour vos piste et vos éclaircissements. Comme vous l'avez compris je début sous numpy...
    Il faut prendre le temps d'ouvrir la documentation de numpy pour voir ce que vectorize et fromfunction font, attendent comme paramètres et comprendre les cas d'utilisations donnés en exemple.

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

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 52
    Points
    52
    Par défaut
    Re,

    en me relisant je m'excuse pour les fautes d'orthographe laissées dans mon texte. J'avais consulté cette documentation en plus des exemples sur le forum. Le constat est que dans mon premier j'ai placé un paramètre dans ma fonction appelé nbtous qui visiblement est la dimension du futur tableau retourné (vrai ou faux ?)

    Par contre lorsque j'introduis le paramètre stratégie dans le second cas, plus rien ne fonctionne même si je mets deux paramètres à ma fonction play(Strategie.CHANGER, nbtous).
    La seule chose que je semble avoir saisi pour vectorize est que cela permet de retourner un nd.array. je me demande même si l’utilisation de vectorize est nécessaire puisque ma fonction play retourne un array.

    En fait ici j'insiste sur un point : je ne veux pas la réponse mais bien des pistes pour comprendre cette mauvaise "codification".

    Comme vous le voyez c'est assez confus dans ma tête.

    Merci d'avance

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par beckhton Voir le message
    En fait ici j'insiste sur un point : je ne veux pas la réponse mais bien des pistes pour comprendre cette mauvaise "codification".
    Vous utilisez vectorize et fromfunction mais je ne comprends pas la logique de ce que vous voulez en faire.
    Vous pourriez commencer par simplifier le problème en disant: "j'ai une fonction f qui retourne un nombre aléatoire dans 0, 1 et je voudrais stocker le résultat de N appels à cette fonction dans un tableau numpy de dimension N".
    Le problème étant simplifié, on lance la console python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import numpy as np
    >>> from random import choice
    >>> def f():
    ...     return choice((0,1))
    ...
    puis on essaie de jouer avec vectorize:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> v = np.vectorize(lambda z: f(), otypes=[np.int])
    >>> v([1,2,3])
    array([0, 0, 0])
    >>> v([1,2,3])
    array([1, 1, 0])
    >>>
    Ca me retourne bien un tableau mais ses dimensions sont définies par ce qui lui est passé en argument.
    Si vous avez un peu testé fromfunction, vous avez pu constater que la fonction reçoit le tableau en argument (juste comme l'attend vectorize). Donc çà se compose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> np.fromfunction(v, (5,))
    array([1, 0, 0, 0, 1])
    Et j'ai fait quoi jusqu'ici? Une lecture "intelligente" de la documentation où je teste/vérifie que j'ai a peu près compris ce que çà raconte et que je sais en tirer profit pour répondre à mon besoin (stocker les N appels à f dans un tableau).

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

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 52
    Points
    52
    Par défaut
    Merci pour votre aide et votre reformulation du problème initial, je vais tenter de conclure...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Points : 52
    Points
    52
    Par défaut
    En fait je crois grâce à votre exemple que je viens de corriger une de mes boulettes. Ce que j'envoyais dans fromfunction n'était pas une fonction mais un numpy.array. En fait lorsque j'utilisais la fonction vectorize, il faut utiliser une fonction lambda pour avoir à coup sur une fonction que l'on peut mettre en argument dans fromfunction.

    Cela fonctionne désormais :

    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
    45
    46
    47
    48
    49
    50
    51
     
    %matplotlib inline
     
    import numpy as np
    import matplotlib.pyplot as plt
    from enum import Enum
     
    class Strategie(Enum):
        GARDER = 0
        CHANGER = 1
     
    def play(strategie):
        """Simulation du jeu de Monty Hall"""
     
        results = np.array([])
     
        # Portes disponibles au début du jeu
        doors = np.array([1, 2, 3])
     
        # Porte où se cache la voiture
        car = np.random.randint(1,4,1)
     
        # Porte choisie par le candidat
        choice = np.random.randint(1,4,1)
     
        # Portes que le présentateur peut ouvrir
        open_doors = np.setdiff1d(doors,[car, choice])
     
        # Porte ouverte par le présentateur
        open_door = np.random.choice(open_doors, 1)
     
        # Porte qui reste fermée après l'ouverture du présentateur
        other_closed_door = np.setdiff1d(doors, [choice, open_door])
     
        # L'heure du second choix : GARDER ou CHANGER
        if strategie == Strategie.GARDER:
            second_choice = choice
     
        else:
            second_choice = other_closed_door
     
        if second_choice == car:
            results = np.append(results, 1)
        else:
            results = np.append(results, 1)
     
        return results
     
    v = np.vectorize(lambda z : play(Strategie.GARDER))
    print(v)
    liste = np.fromfunction(v, (100,), dtype=int)

    Merci merci !!

Discussions similaires

  1. numpy.corrcoef / numpy.dot qui bloque. Problème avec librairie BLAS?
    Par Lidial dans le forum Calcul scientifique
    Réponses: 5
    Dernier message: 21/02/2014, 11h03
  2. problème avec les vecteur de numpy
    Par anthony.pa dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 14/02/2013, 13h44
  3. Problème installation numpy et python avec support zlib
    Par tazgero dans le forum Déploiement/Installation
    Réponses: 5
    Dernier message: 04/07/2011, 15h20
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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