0

私は 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 が必要になる場合があります。しかし、データの受け渡しを理解したら、これを行うためのより効率的な方法を見つけられるはずです。)

助けてくれてありがとう。

4

1 に答える 1

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])

私は最初にラムダを試しましたが、どうやらそれは漬けることができなかったので、それはうまくいきませんでした。

于 2012-09-26T01:35:45.983 に答える