1

plan以下のコードは正しい答えを示していますが、配列 (およびmeas) が比較的小さい場合にのみ機能します。実際に比較する必要がある配列(それぞれ300x300)でこれを実行しようとすると、永遠にかかります(45分後に終了しているため、どれくらい時間がかかるかわかりません)。評価されるインデックスの周囲の配列値 ( p)。nditer フラグに関するドキュメントを見つけようとしました'ranged'が、反復する特定の範囲を実装する方法が見つかりません。

p = np.nditer(plan, flags = ['multi_index','common_dtype'])
while not p.finished:
    gam_store = 100.0
    m = np.nditer(meas, flags = ['multi_index','common_dtype'])
    while not m.finished:
        dis_eval = np.sqrt(np.absolute(p.multi_index[0]-m.multi_index[0])**2 + np.absolute(p.multi_index[1]-m.multi_index[1])**2)           
        if dis_eval <= 6.0:
            a = (np.absolute(p[0] - m[0]) / maxdose) **2
            b = (dis_eval / gam_dist) **2
            gam_eval = np.sqrt(a + b)
            if gam_eval < gam_store:
                gam_store = gam_eval
        m.iternext()    
    gamma = np.insert(gamma, location, gam_store, 0)
    location = location + 1
    p.iternext()
4

1 に答える 1

2

配列のごく一部だけを繰り返し処理したい場合は、(質問を誤解していない限り)配列のスライスから nditer インスタンスを作成するだけでよいと思います。

の近くの配列のみが必要だとする(i,j)と、次から始めます。

w = 5    # half-size of the window around i, j
p = np.nditer(plan[i-w:i+w, j-w:j+w], flags=...)

これは、次のように機能します。

a = array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19],
           [20, 21, 22, 23, 24]])

それで、

w = 1
i, j = 2,2
print a[i-w:i+w+1, j-w:j+w+1]
#array([[ 6,  7,  8],
#       [11, 12, 13],
#       [16, 17, 18]])
于 2013-05-15T02:06:10.670 に答える