多个进程 - python - 具有多维数组的简单循环

时间:2015-12-13 20:07:44

标签: python arrays multiprocessing convolution

多处理新手,我无法理解文档。如何在多个进程中运行此表单的函数?这是我的尝试。我希望运行卷积(从其他开始)通过多个流程以提高速度。

{{1}}

当前错误:

  

追踪(最近一次呼叫最后一次):

     

文件“”,第11行,in       y_test =数组('i',np.zeros((10,10,4)))

     

文件“/usr/lib/python2.7/multiprocessing/init.py”,第260行,   排列       return array(typecode_or_type,size_or_initializer,** kwds)

     

文件“/usr/lib/python2.7/multiprocessing/sharedctypes.py”,第115行,   在数组中       obj = RawArray(typecode_or_type,size_or_initializer)

     

文件“/usr/lib/python2.7/multiprocessing/sharedctypes.py”,第89行,   在RawArray       结果。的初始化(* size_or_initializer)

     

TypeError:只能将length-1数组转换为Python标量

y_test将是输出

2 个答案:

答案 0 :(得分:2)

违规行是

y_test = Array('y_test',np.zeros((10,10,4)))

这是完全错误的。有关multiprocessing.Array

的文档说明
  

multiprocessing.Array(typecode_or_type,size_or_initializer,*,lock = True)   
...
  typecode_or_type确定返回数组的元素类型:它是数组模型使用的ctypes类型或单字符类型代码 ...

错误只是说y_test不是知道类型。

无论如何,你没有把问题放在右边。

因为multiprocessing.Array是存储在共享内存中的基元类型数组。在这里,您可以通过numpy数组的flat迭代器轻松构建这样的数组:

y_test = Array('d', np.zeros((10,10,4)).flat)

y_test现在是400个双打的共享内存数组

让我们暂时忘记多处理。你可以这样处理它:

for i in range(r):
    npi = start[:,:,i] + i
    y_test[10*10*i:10*10*(i+1)] = npi.flatten()

您现在可以将其转换回numpy数组:

resul = np.array(y_test).reshape((10,10,4), order = 'f')

这里有趣的一点是,每个10x10阵列的处理访问共享内存的不同部分:我们可以在不同的进程中构建它

def process(a, i):
    npi = start[:,:, i] + i    # computes a numpy array
    a[10*10*i:10*10*(i+1)] = npi.flatten()  # stores it in shared memory

def main():
    y_test = Array('d', np.zeros((10,10,4)).flat) # initializes shared memory
    processes = []
    for i in range(4):  # uses 4 processes, one per each 10x10 array
        p = Process(target = process, args = (y_test, i))
        processes.append(p)
        p.start()
        print("Start", i, p.pid)  # to be sure the processes were started
    for i in range(4):
        p.join()        # join child processes
        print("Join", i, p.exitcode)
    resul = np.array(y_test).reshape((10,10,4), order='f') # rebuild the final numpy array
    print(resul)

if __name__ == '__main__':
    main()

答案 1 :(得分:1)

例外

你在这里得到一个例外,因为Array(...)的第一个参数需要是ctypec_bool,...或者一个有效的c_int表示像'i'这样的类型的字符。 'y_test'不是有效的ctype。看来你输入的是变量名,而不是它们的类型。

试试这个,如果你想在这里使用整数:

y_test = Array('i', np.zeros((10,10,4)))

请查看the Array documentation以获取有关阵列工作原理的更多详细信息。您还可以使用list of valid type codes

其他想法,并行执行

另外,请记住,该过程将使用您提供的参数运行函数loop。你提供了两个数组,但似乎循环函数需要一个数组和一个整数作为参数。当你想用i的不同值运行循环函数的多个实例时,你可以创建多个Process实例并为每个实例赋予不同的值作为参数,如下所示:

p1 = Process(target = loop, args = (y_test, 1))
p2 = Process(target = loop, args = (y_test, 2))

每个进程都将使用不同的参数运行循环函数。你也可以把它放在一个循环中,迭代你的arr来处理arr中的每个值,我认为 - 这就是你想要的。