我是IPython并行程序包的新手,但我真的想要实现它。我有一个4D numpy数组,我想通过切片,行,列运行第四维(时间)。处理是一个最小化例程,需要花费一些时间,这就是我想要并行化的原因。
from IPython.parallel import Client
from numpy import *
from matplotlib.pylab import *
c = Client()
v = c.load_balanced_view()
v.block=False
def process( src, freq, d ):
# Get slice, row, col
sl,r,c = src
# Get data
mm = d[:,sl,c,r]
# Call fitting routine
<fiting routine that requires freq, mm and outputs multiple parameters>
return <output parameters??>
## Create the mask of what we are going to process
mask = zeros(d[0].shape)
mask[sl][ nonzero( d[0,sl] > 10*median(d[0]) ) ] = 1
# find all non-zero points in the mask
points = array(nonzero( mask == 1)).transpose()
# Call async
asyncresult = v.map_async( process, points, freq=freq, d=d )
我的函数“process”需要两个参数:1)freq是一个numpy数组(100,1)和2)d,它是(100,50,110,110)左右。我想从拟合中检索几个参数。
我看到的所有使用map_async的例子都有简单的lambda函数等,输出似乎很简单。
我想要的是将“进程”应用于掩码不为零的d中的每个点,并将输出参数的映射应用于同一空间。 [补充:我得到“process()正好需要3个参数(给定1个)]。
(这可能是必需的第2步,因为我正在向每个进程传递一个巨大的numpy数组“d”。但是一旦我弄清楚数据传递,我希望能够找到一种更有效的方法来实现这一点。 )
感谢您的帮助。
答案 0 :(得分:2)
我通过
解决了数据传递问题def mapper(x):
return apply(x[0], x[1:])
使用元组列表调用map_async,其中第一个元素是我的函数,其余元素是我的函数的参数。
asyncResult = pool.map_async(mapper, [(func, arg1, arg2) for arg1, arg2 in myArgs])
我先尝试了一个lambda,但显然无法腌制,所以这是不行的。