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:
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:
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:
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...