我有我的职能:
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添加固定值。
有人会建议我如何建立这样的循环吗?
谢谢
编辑:
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也没有循环通过
答案 0 :(得分:0)
这是一种使用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
例如,此数据分析向您显示,随着您增加std
,您的预测会变得更加准确(n
较小)。