Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Monty Hall问题是否有无循环的Pandas/Numpy实施?_Python_Pandas_Numpy - Fatal编程技术网

Python Monty Hall问题是否有无循环的Pandas/Numpy实施?

Python Monty Hall问题是否有无循环的Pandas/Numpy实施?,python,pandas,numpy,Python,Pandas,Numpy,这更像是一个好奇的练习 若你们还并没有听说过蒙蒂霍尔问题,那个么这本伟大的著作将对此进行解释 我使用numpy在python中模拟了它: 将numpy导入为np num_games=100000 选项=np.arange(1,4,1) 粘贴结果=0 开关\u结果=0 对于范围内的i(1,num_游戏+1): winning_door=np.random.randint(1,4) first_choice=np.random.randint(1,4) 如果获胜门==第一选择: 坚持成功+=1 #移

这更像是一个好奇的练习

若你们还并没有听说过蒙蒂霍尔问题,那个么这本伟大的著作将对此进行解释

我使用numpy在python中模拟了它:

将numpy导入为np
num_games=100000
选项=np.arange(1,4,1)
粘贴结果=0
开关\u结果=0
对于范围内的i(1,num_游戏+1):
winning_door=np.random.randint(1,4)
first_choice=np.random.randint(1,4)
如果获胜门==第一选择:
坚持成功+=1
#移除不是获胜门或首选门的门
门到门移除=np.random.choice(选项[~np.isin(选项,[获胜门,第一选择]))
移除门后的选项=选项[~np.isin(选项,门移除)]
#将门切换到不是首选的剩余选项
切换后的第二个选项=移除一扇门的选项[~np.isin(移除一扇门的选项,第一个选项)]
如果获胜\u门==切换后的第二个\u选择\u:
开关_结果+=1
但是,这是否可以在没有for循环的情况下实现?这是我到目前为止所做的,但我不确定如何进行门切换

将numpy导入为np
num_games=100000
选项=np.arange(1,4,1)
获胜门=np.random.randint(1,4,num_游戏)
first_choice=np.random.randint(1,4,num_游戏)
stick_successions=(winding_door==第一选择)。sum()
#移除不是获胜门或首选门的门
门到移除=???
移除一扇门后的选项=???
#将门切换到不是首选的剩余选项
开关后的第二个选项=???
切换成功=(获胜门==切换后的第二选择)。sum()
您必须确定gameshow主机从游戏的每个实例中移除的门(每行
获胜门
第一选择
阵列),然后将
第一选择
切换到其他剩余的门。)


有什么想法吗?

你这里最大的问题是用面具将
选择
矢量化。这可能看起来像:

def沿_轴(arr,其中,索引,轴)取_屏蔽_:
“”“沿轴上的每个1d切片获取索引的第个非屏蔽元素”“”
断言where.dtype==bool
断言索引。形状[轴]==1
#np.searchsorted会更快,但不会矢量化
无掩码_索引=(其中.cumsum(axis=axis)>索引).argmax(axis=axis)
unmasked_index=np.扩展_dims(unmasked_index,axis=axis)#argmax无keepdims的变通方法
返回np。沿_轴取_(arr,无掩码_索引,轴=轴)
def随机_选择_屏蔽_沿_轴(arr,其中,轴):
“”“如上所述,但通过统一的随机数选择索引”“”
断言where.dtype==bool
index=np.random.sample(arr.shape[:axis]+(1,)+arr.shape[axis+1:])*where.sum(axis=axis,keepdims=True)
返回沿_轴(arr,其中,索引,轴=轴)屏蔽的获取_
使代码的第一部分类似于

options\u broadcast=np.broadcast\u to(选项,(3,num\u游戏))
可移动=(选项!=选项广播)和(选项!=选项广播)
门到移除=沿轴随机选择屏蔽(选项广播,其中=移除,轴=0)

(option==winning\u door)|(option==first\u choice)
替换
np.isin(options[winning\u door,first\u choice])
可能会对您有所帮助<代码>选项没有矢量化,所以我认为总体答案是“否”。当然,你可以使用
np.vectorize
,但这基本上只是一个循环,速度也差不多。这是一个连续的过程吗?记住,我们并不是在移除循环;我们只是将它们转移到编译代码中。但从Python程序员的角度来看,操作从顺序变为并行,所有步骤和决策同时发生。感谢各位的见解!我想你是对的,使用索引仍然只是循环。