我是一名公认的非常基本的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
返回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
然后将收集的输出写入文件。通常,我只是让每个model_solve函数将其结果写入文件,但是这段代码将在PiCloud或其他平台上运行,在这个平台上我不一定能够编写文件直到结果返回本地机器。相反,我正在尝试返回一个巨大的NumPy数组runs
* 7列和4950行 - 然后可以将其写入本地计算机上的文件。
有关如何处理此问题的任何线索?
答案 0 :(得分:11)
使用列表保存所有结果:
results = []
for i in range(runs):
results.append(model_solve(100))
然后通过以下方式获取输出数组:
np.hstack(results)
答案 1 :(得分: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
除了使用list之外,您还可以直接使用数组来存储结果:
resutls=np.zeros([numberOfRuns,ShapeOfModelResults])
for i in range(numberOfRuns):
results[numberOfRuns,modelSolve(100)] # this will put the result directly in the matrix
我希望我的回答可以帮助您编写更快更清晰的代码