我想优化我写的模拟。我将提供我创建的代码,然后我将解释我想要实现的主要思想:
for exp_itrs in range(99999):
coin_flips = np.zeros((1000,10))
for toss in range(999):
toss_10 = np.random.randint(0,2,size = (10))
coin_flips[toss] = toss_10其总体思路是运行下面的实验模拟100,000次:抛出1000枚硬币,每个硬币10次。使用一个大小为(1000,10)的数值矩阵来记录每个实验(行代表硬币,每列是一次掷硬币)。
现在,我的PC大约需要5分钟来运行这个简单的代码。
发布于 2017-11-04 02:33:52
理想情况下,可以这样做:
import numpy as np
experiment = np.random.randint(0, 2, (100000, 1000, 10), dtype=np.uint8)注意,这只需要100000*1000*10*1e-9 =1 1e
在行动中:
>>> import numpy as np
>>> experiment = np.random.randint(0, 2, (100000, 1000, 10), dtype=np.uint8)
>>> means = experiment.mean(axis=(0,1))
>>> means
array([ 0.50002927, 0.49993242, 0.5000543 , 0.49999995, 0.49997455,
0.49999587, 0.4999641 , 0.4999488 , 0.50001366, 0.50000301])
>>> experiment.nbytes
1000000000
>>> experiment.nbytes * 1e-9 # plenty of RAM to spare
1.0在我相对普通的笔记本电脑上:
>>> timeit.timeit("experiment = np.random.randint(0, 2, (100000, 1000, 10), dtype=np.uint8)", "import numpy as np", number=10)
29.73300809401553
>>> _ / 10
2.973300809401553 # seconds per experiment发布于 2017-11-04 02:33:33
您可以使用numpy.random.rand创建一个由0 <= x< 1的随机值组成的矩阵,然后使用<0.5的treshold将其作为值0或1的别名。
numpy.random.rand(10000, 1000, 10)https://stackoverflow.com/questions/47102190
复制相似问题