从返回NumPy Arrays的循环中收集结果

Fom*_*ite 8 python numpy

我是一个公认的非常基本的Python程序员,在我遇到实现各种研究问题的问题时试图学习.而且我遇到了其中一个问题 - 特别是如何处理我返回一堆数据的循环,而不是通常的"输出单个数字"示例,您只需将循环结果添加到以前的所有内容中.

这是我正在尝试运行的非循环脚本的要点:https://gist.github.com/1390355

真正突出的一点是model_solve函数的结束:

def model_solve(t):
    # lots of variables set
    params = np.zeroes((n_steps,n_params)
    params[:,0] = beta
    params[:,1] = gamma
    timer = np.arange(n_steps).reshape(n_steps,1)
    SIR = spi.odeint(eq_system, startPop, t_interval)
    output = np.hstack((timer,SIR,params))
    return output
Run Code Online (Sandbox Code Playgroud)

这将返回ODE积分位(spi.odeint)的结果以及一个简单的"我们开什么时间步骤?" 计时器和两个随机变量的值基本上是两列,重复很多次,形式为4950行和7列NumPy数组.

然而,目标是对具有随机值的两个参数(β和γ)进行蒙特卡罗分析.从本质上讲,我想创建一个循环的函数:

def loop_function(runs):
  for i in range(runs):
    model_solve(100)
    # output of those model_solves collected here
  # return collected output
Run Code Online (Sandbox Code Playgroud)

然后将收集的输出写入文件.通常,我只是让每个model_solve函数将其结果写入一个文件,但是这个代码将在PiCloud或其他平台上运行,在这个平台上我不一定能够编写文件,直到结果返回到本地机器.相反,我正在尝试返回一个巨大的NumPy数组runs*7列和4950行 - 然后可以将其写入本地计算机上的文件.

有关如何处理此问题的任何线索?

HYR*_*YRY 12

使用列表保存所有结果:

results = []
for i in range(runs):
    results.append(model_solve(100))
Run Code Online (Sandbox Code Playgroud)

然后得到输出数组:

np.hstack(results)
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这……简单得令人尴尬。刚刚做了概念验证,这个答案似乎有效,所以我接受它。 (2认同)

Oz1*_*123 9

实际上,如果你的代码有一个更大的循环,你应该总是尝试对你的问题进行矢量化.如果速度很重要,你应该知道"for loops"是瓶颈.此外,追加操作非常慢并且需要更多内存,因为它会创建副本.因此,更好的解决方案应该是:

results = [0]*runs # if you want to use lists...

[model_solve(100) for x in results] # do see list comprehension in python 
Run Code Online (Sandbox Code Playgroud)

除了使用list之外,您还可以直接使用数组来存储结果:

resutls=np.zeros([numberOfRuns,ShapeOfModelResults])

for i in range(numberOfRuns):
    results[numberOfRuns,modelSolve(100)] # this will put the result directly in the matrix
Run Code Online (Sandbox Code Playgroud)

我希望我的回答可以帮助您编写更快更清晰的代码