私は IPython 並列パッケージを初めて使用しますが、本当にそれを実現したいと考えています。私が持っているのは、スライス、行、列を実行し、4 次元 (時間) を処理したい 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 )
私の関数「プロセス」には 2 つのパラメーターが必要です。1) freq は numpy 配列 (100,1) であり、2) d は (100, 50, 110, 110) 程度です。フィッティングからいくつかのパラメータを取得したいと考えています。
私が見た map_async を使用するすべての例には、単純なラムダ関数などが含まれており、出力は些細なもののようです。
私が望むのは、マスクがゼロではない d のすべてのポイントに「プロセス」を適用し、出力パラメーターのマップを同じ空間に配置することです。[追加: 「process() は正確に 3 つの引数を受け取ります (1 つ指定)]。
(各プロセスに巨大な numpy 配列 "d" を渡すため、この手順 2 が必要になる場合があります。しかし、データの受け渡しを理解したら、これを行うためのより効率的な方法を見つけられるはずです。)
助けてくれてありがとう。