循环增加索引不规则的函数

时间:2018-09-27 23:47:19

标签: python while-loop

我有我的职能:

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也没有循环通过

1 个答案:

答案 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较小)。