2014-02-08 2 views
0

Я пишу симуляцию проблемы зала в monty, и я не могу, чтобы жизнь меня поняла, что вызывает эту ошибку. Если вы не знакомы с проблемой зала monty, это гипотетическое игровое шоу, где есть 3 двери, есть приз за одной дверью и 2 двери ни с чем. Участник выбирает дверь, а затем хозяин открывает дверь без победителя и дает сопернику возможность переключаться или оставаться с оригинальным выбором. Оригинальный выбор имеет 1/3 шанс быть правым, а стратегия переключения имеет шанс 2/3 быть правым.python error: '' TypeError: только массивы длиной-1 могут быть преобразованы в скаляры Python ''

Моя первая функция есть занимает 2 массивы, которые случайным образом выбранные двери, а затем создает третий массив, который дверь

import numpy as np 
import pandas as pd 


def reveal_and_switch(win_door,first_pick): 
    '''Create arrays for the door to be revealed by the host and the switch door''' 
    #Take in arrays for the winning door and the contestant's first pick 
    doors = [1,2,3] 
    switch_door = np.array([0]*len(win_door)) 
    for i in range(len(switch_door)): 
     if first_pick[i] != win_door[i]: 
      switch_door[i] = win_door[i] 
     else: 
      del doors[np.searchsorted(doors,first_pick[i])] 
      switch_door[i] = np.random.choice(doors) 

    #print switch_door 
    return switch_door 


def create_doors(iterations): 
    '''Create a DataFrame with columns representing the winning doors, 
    the picked doors and the doors picked if the player switches and the 
    accumulating probabilities''' 
    win_door = np.random.random_integers(1,3,iterations) 
    first_pick = np.random.random_integers(1,3,iterations) 
    switch_door = reveal_and_switch(win_door,first_pick) 
    #allocate memory for 
    denom = np.array([0]*len(win_door)) 
    first_win = np.array([0]*len(win_door)) 
    switch_win = np.array([0]*len(win_door)) 
    switch_prob = np.array([0]*len(win_door)) 
    stay_prob = np.array([0]*len(win_door)) 

    for i in len(range(switch_door)): 
     denom[i] = i + 1 
     if switch_door[i] == win_door[i]: 
      switch_win[i] = 1 
      first_win[i] = 0 
     elif first_pick[i] == win_door[i]: 
      switch_win[i] = 0 
      first_win[i] = 1 



    switch_prob = np.cumsum(switch_win)/denom 
    stay_prob = np.cumsum(first_win)/denom 
    df = pd.DataFrame({'iterations': iterations, 
        'Stubborn Win': first_win, 
        'Switch Win': switch_win, 
        'stubborn probability': stay_prob, 
        'switch probability': switch_prob}) 
    print df 
    return df 

и когда я называю create_doors (10), я получаю это:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 14, in create_doors 
TypeError: only length-1 arrays can be converted to Python scalars 

ответ

1

воспроизвести такую ​​ошибку:

In [32]: a 
Out[32]: array([0, 1, 2]) 

In [33]: range(a) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-33-5515275ab580> in <module>() 
----> 1 range(a) 

TypeError: only length-1 arrays can be converted to Python scalars 

В коде range(switch_door), это как и мой range(a).

Кстати, в вашем коде,

denom = np.array([0]*len(win_door)) 
first_win = np.array([0]*len(win_door)) 

может просто быть упрощена:

denom=np.zeros_like(win_door) 
first_win = denom.copy() 
+0

Спасибо так много! Ты жжешь! – panterasBox

Смежные вопросы

 Смежные вопросы