2014-02-08 35 views
0

我正在寫蒙蒂大廳問題的模擬,我無法理解導致此錯誤的原因。如果你不熟悉蒙蒂大廳的問題,這是一個假設的遊戲節目,有三扇門,一扇門後有獎品,兩門沒有任何東西。選手挑選一扇門,然後主持人打開一個非贏的門,並讓參賽者可以選擇切換或保留原來的選秀權。原始選擇有三分之一的機會是正確的,切換策略有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),I得到這樣的:

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

相關問題