如何从多进程池映射中返回numpy数组?

5

我有一个名为“func”的函数,它接收一个包含名为“matrix_image”的图片行数的列表:

list_rows = range(N_rows)

然后,计算在函数内完成,我获得了一个新的行,表示图像的结果矩阵。

def func(list_rows):
    new_row = numpy.empty(N_columns)
    ....
    ....# some computation
    ....
    return new_row


matrix_image = pool.map(func, list_n_rows )

"func内正确计算了new_row,因为我在调试器中看到了值,但结果的matrix_image的形状是(list_n_rows,),所有值都填充为None
如何从func返回一个(1D numpy array)row,以便将其附加到resultant matrix(2D numpy array)中?"

1
使用 return?如果在尝试时出现了问题,您需要向我们展示一个 [mcve] 以解决问题。 - user2357112
我已经在map中添加了清晰的问题和结果值。这个例子对于这个问题来说是完全的。 - eduardosufan
2
@eduardosufan,您误解了MCVE的含义。您需要发布可以直接粘贴到脚本中并且无需修改即可运行并重现问题的代码。当我基于您提供的信息创建了一个基本的工作脚本时,它按预期工作 - 数组被正确返回。 - senderle
1
看看以下帖子,也许你会找到方法:在这里输入链接说明 - Radmar
1个回答

3

您可以使用multiprocessing的RawArray功能,其中您可以将需要从进程访问的变量定义为RawArray,然后在启动进程之前访问它,最后作为重新形成的numpy数组进行访问。

这是一个例子:

import numpy as np
import multiprocessing as mp

n_elements = 1000 # how many elements your numpy should have

def myProc( shared_var ):
    '''
    here you convert your shared variable from mp.RawArray to numpy
    then treat it as it is numpy array e.g. fill it in with some 
    random numbers for demonstration purpose
    '''
    var = np.reshape( np.frombuffer( shared_var, dtype=np.uint32 ), -1 )
    for i in range( n_elements ):    
        var[i] = np.random.randint( 0, 2**16, 1 )
    print( 'myProc var.mean() = ', var.mean() )               
                                  
#buffer that contains the memory
mp_var = mp.RawArray( 'i', n_elements )
p = mp.Process( target=myProc, args=(mp_var,) )
p.start()                                      
p.join()

#after the process has ended, you convert the buffer that was passed to it
var = np.reshape( np.frombuffer( mp_var, dtype=np.uint32 ), -1)
#and again, you can treat it like a numpy array
print( '   out var.mean() = ',var.mean() )                                            

输出结果为:
myProc var.mean() =  32612.403
       var.mean() =  32612.403

希望这可以帮到你!请注意,如果您从并发进程访问此缓冲区,则需要组织适当的锁定机制,以便两个进程不会同时修改相同的内存块。

“mp_buff” 似乎是您所指的“mp_var”,我说得对吗? - Ruli
是的,看起来你是正确的。感谢你发现了这个问题! - lazaraza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接