收集返回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
这个部分返回了ODE(常微分方程)积分的结果(spi.odeint
),还有一个简单的“我们现在处于哪个时间步?”的计时器,以及两个随机变量的值,这些值以4950行和7列的NumPy数组形式重复了很多次。
不过,我的目标是对两个参数(beta和gamma)进行蒙特卡洛分析,这两个参数的值是随机的。简单来说,我想做一个循环函数,大致是这样的:
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行的数据——然后可以将其写入我本地机器上的文件。
有没有什么建议可以帮助我解决这个问题?
2 个回答
11
其实,如果你的代码里有很大的循环,最好尝试把问题“向量化”。如果速度很重要,你需要知道“for循环”会成为一个瓶颈。而且,添加元素的操作非常慢,还会占用更多内存,因为它会创建副本。所以,更好的解决方案应该是:
results = [0]*runs # if you want to use lists...
[model_solve(100) for x in results] # do see list comprehension in python
除了使用列表,你还可以直接用数组来存储你的结果:
resutls=np.zeros([numberOfRuns,ShapeOfModelResults])
for i in range(numberOfRuns):
results[numberOfRuns,modelSolve(100)] # this will put the result directly in the matrix
希望我的建议能帮助你写出更快、更清晰的代码。
14
用一个列表来保存所有的结果:
results = []
for i in range(runs):
results.append(model_solve(100))
然后通过以下方式获取输出数组:
np.hstack(results)