0

我正在使用 PyMC 进行 MCMC 计算。我的数据由 47 个部分组成,每个部分的形状为 24 * 1000。

为了让 MCMC 工作,我从 47 个部分中创建了一个大型阵列,所以我现在有一个 (1128)* 1000 阵列。

然后拟合的模型创建一个相同大小的数组。它在循环中执行此操作,因为对于 47 个部分中的每一个部分,都必须加载不同的值(如缩放因子)。

可以说 map 是我的数组:

for i in range(len(map[::])/47):

  scale = scale_all[i]

  self.trans_calc["t"] = 0.   
  self.trans_calc.xyzPos()
  pos0 = self.trans_calc.calc_pos1()

  for k in range(24):

    self.trans_calc["t"] = self.time[k]               
    self.trans_calc.xyzPos()

    if self.trans_calc.onstar() == False: 

        curve = pos0

    else:

        pos1 = self.trans_calc.calc_pos1()
        curve = pos0 - pos1 + 1.0 * scale

    map[k+i*47] = curve

return map

由于 47 个部分相互独立,如果我使用多处理,我会得到加速。

我只是不明白我必须如何设置它才能写入地图中的正确位置。我一直在寻找解决方案,但没有找到任何东西。或者我不明白我发现了什么。

4

1 回答 1

0

我没有使用 PyMC 的经验,我很难看到你在代码中到底在做什么。但是,如果进程是独立的,您应该以一种可以将链的每一部分“映射”到返回结果的函数的方式编写脚本。

from multiprocessing import Pool
pool = Pool(processes=8)              
result = pool.map(build_markov_chain, list_of_input_arrays)  

这样,结果与输入的顺序相同。因此,我建议不要构建 (1128)*1000 数组,而是将它们保留为包含 47 个形状为 24*1000 的数组的列表。

于 2013-08-06T22:24:18.737 回答