【问题标题】:Collecting results from a loop that returns NumPy Arrays从返回 NumPy 数组的循环中收集结果
【发布时间】:2011-11-24 01:05:02
【问题描述】:

我是公认的非常基础的 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)进行 Monte Carlo 分析。本质上,我想创建一个循环的函数,有点像这样:

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 或另一个平台上运行,在返回结果之前我不一定有能力写入文件到本地机器。相反,我试图返回一个包含 runs*7 列和 4950 行的巨大 NumPy 数组 - 然后可以将其写入本地计算机上的文件。

关于如何解决这个问题的任何线索?

【问题讨论】:

  • 您是在尝试读取从 Python 函数返回的 numpy 数组,还是如何将 Python 函数的结果写入文件?
  • @DK 如何获取从 Python 函数返回的多个 numpy 数组并将它们组合成一个数组。

标签: python numpy


【解决方案1】:

使用列表保存所有结果:

results = []
for i in range(runs):
    results.append(model_solve(100))

然后通过以下方式获取输出数组:

np.hstack(results)

【讨论】:

  • 嗯,那是......非常容易。刚刚做了一个概念验证,这个答案似乎有效,所以我接受了。
【解决方案2】:

实际上,如果您的代码有一个更大的循环,您应该始终尝试向量化您的问题。 如果速度很重要,您应该知道“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

希望我的回答能帮助你写出更快更清晰的代码

【讨论】:

  • 哪种技术在处理大数据时效率更高、速度更快?如果我们需要循环,有没有办法避免 for 循环?
  • python 中的列表推导稍快
猜你喜欢
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
相关资源
最近更新 更多