1

現在、配列内の特定の要素が等しいかどうかをチェックするコードがあります = 0 である場合は、値を「レベル」値に設定します (temp_board は 2D numpy 配列であり、indexs_to_watch にはゼロを監視する必要がある 2D 座標が含まれています)。

    indices_to_watch = [(0,1), (1,2)]
    for index in indices_to_watch:
        if temp_board[index] == 0:
            temp_board[index] = level

これをより numpy に似たアプローチ (for を削除して numpy 関数のみを使用) に変換して、これを高速化したいと思います。これが私が試したことです:

    masked = np.ma.array(temp_board, mask=(a!=0), hard_mask=True)
    masked.put(indices_to_watch, level)

残念ながら、put() を実行するときにマスクされた配列が 1D 次元を持ちたい場合 (まったく奇妙です!)、0 に等しく具体的なインデックスを持つ配列要素を更新する他の方法はありますか?

それとも、マスクされた配列を使用するのは適切ではないでしょうか?

4

3 に答える 3

1

temp_boardがどこにあるかを見つけることはそれほど非効率的ではないと仮定すると0、次のようにやりたいことができます。

# First figure out where the array is zero
zindex = numpy.where(temp_board == 0)
# Make a set of tuples out of it
zindex = set(zip(*zindex))
# Make a set of tuples from indices_to_watch too
indices_to_watch = set([(0,1), (1,2)])
# Find the intersection.  These are the indices that need to be set
indices_to_set = indices_to_watch & zindex
# Set the value
temp_board[zip(*indices_to_set)] = level

上記を実行できない場合は、ここに方法がありますが、それが最もPythonicであるかどうかはわかりません。

indices_to_watch = [(0,1), (1,2)]

まず、numpy配列に変換します。

indices_to_watch = numpy.array(indices_to_watch)

次に、インデックスを作成できるようにします。

index = zip(*indices_to_watch)

次に、条件をテストします。

indices_to_set = numpy.where(temp_board[index] == 0)

次に、設定する実際のインデックスを把握します。

final_index = zip(*indices_to_watch[indices_to_set])

最後に、値を設定します。

temp_board[final_index] = level
于 2010-02-23T08:50:01.040 に答える
1

あなたの質問のすべての詳細に従っているかどうかはわかりません。私がそれを正しく理解していれば、これは単純な Numpy インデックス作成のようです。以下のコードは、配列 (A) のゼロをチェックし、ゼロが見つかった場合は「レベル」に置き換えます。

import numpy as NP
A = NP.random.randint(0, 10, 20).reshape(5, 4) 
level = 999
ndx = A==0
A[ndx] = level
于 2010-02-21T15:18:42.913 に答える
0

これらの行に沿って何かを試してください:

temp_board[temp_board[field_list] == 0] = level
于 2010-02-21T15:14:33.990 に答える