我有我的功能:
import numpy as np
def monte_carlo1(N):
x = np.random.random (size = N)
y = np.random.random (size = N)
dist = np.sqrt(x ** 2 + y ** 2)
hit = 0
miss = 0
for z in dist:
if z <=1:
hit += 1
else:
miss +=1
hit_ratio = hit / N
return hit_ratio我想做的是对10个不同的N值运行这个函数100次,将数据收集到数组中。
例如,可以通过以下方式生成几个数据集合:
data1 = np.array([monte_carlo1(10) for i in range(100)])
data2 = np.array([monte_carlo1(50) for i in range(100)])
data3 = np.array([monte_carlo1(100) for i in range(100)]) 但是,如果我可以创建一个while循环,它可以迭代10次来生成10个数据数组,而不是拥有10个变量data1...data10,那就更好了。
然而,我希望能够在monte_carlo(N)中以不规则的数量增加N的值,所以在我的循环中,我不能在每次迭代中只给N增加一个固定值。
WOuld,有人建议我如何构建这样的循环吗?
谢谢
编辑:
N_vals = [10, 50, 100, 250, 500, 1000, 3000, 5000, 7500, 10000]
def data_mc():
for n in N_vals:
data = np.array([monte_carlo1(n) for i in range(10)])
return data我像这样设置了函数,但是函数的输出只是一个数组,这表明我做错了什么,并且N_values没有被循环
发布于 2018-09-28 20:13:56
下面是一个使用pandas.DataFrame的解决方案,其中行索引是该迭代的n的值,列表示每个repeat迭代。
import pandas as pd
def calc(n_list, repeat):
# this will be a simply list of lists, no special 'numpy' arrays
result_list = []
for n in n_list:
result_list.append([monte_carlo1(n) for _ in range(repeat)])
return pd.DataFrame(data=result_list, index=n_list)这将允许您在之后进行一些数据分析:
>>> from my_script import calc
>>> n_list = [10, 50, 100, 250, 500]
>>> df = calc(n_list, 10)
>>> df
0 1 2 3 4 5 6 7 8 9
10 0.600 0.800 0.700 0.800 0.600 1.000 0.800 0.800 0.700 0.900
50 0.840 0.860 0.700 0.860 0.740 0.860 0.780 0.740 0.740 0.820
100 0.770 0.780 0.730 0.790 0.780 0.730 0.760 0.740 0.770 0.690
250 0.784 0.804 0.792 0.768 0.800 0.780 0.792 0.800 0.804 0.764
500 0.798 0.776 0.782 0.786 0.768 0.798 0.786 0.774 0.774 0.796现在,您可以按n的值计算统计数据
>>> import pandas as pd
>>> stats = pd.DataFrame()
>>> stats['mean'] = df.mean(axis=1)
>>> stats['standard_dev'] = df.std(axis=1)
>>> stats
mean standard_dev
10 0.7700 0.125167
50 0.7940 0.061137
100 0.7540 0.030984
250 0.7888 0.014459
500 0.7838 0.010891例如,此数据分析表明,随着n的增加,您的预测会变得更准确(std更小)。
https://stackoverflow.com/questions/52546482
复制相似问题