7

NumPyArray にセット内の値があるかどうかを確認したい場合は、配列内のその領域を 1 に設定します。ない場合は、keepRaster を 2 に設定します。

numpyArray = #some imported array
repeatSet= ([3, 5, 6, 8])

confusedRaster = numpyArray[numpy.where(numpyArray in repeatSet)]= 1

収量:

<type 'exceptions.TypeError'>: unhashable type: 'numpy.ndarray'

それをループする方法はありますか?

 for numpyArray
      if numpyArray in repeatSet
           confusedRaster = 1
      else
           keepRaster = 2

明確にして、もう少し助けを求めるには:

私が取得しようとしていること、および現在行っていることは、ラスター入力を配列に入れることです。2 次元配列の値を読み取り、それらの値に基づいて別の配列を作成する必要があります。配列値がセット内にある場合、値は 1 になります。セット内にない場合、値は別の入力から導出されますが、ここでは 77 とします。これは私が現在使用しているものです。私のテスト入力には、約 1500 行と 3500 列があります。行 350 付近で常にフリーズします。

for rowd in range(0, width):
    for cold in range (0, height):
        if numpyarray.item(rowd,cold) in repeatSet:
            confusedArray[rowd][cold] = 1
        else:
            if numpyarray.item(rowd,cold) == 0:
                confusedArray[rowd][cold] = 0
            else:
                confusedArray[rowd][cold] = 2
4

3 に答える 3

14

バージョン 1.4 以降では、numpy がこのin1d機能を提供します。

>>> test = np.array([0, 1, 2, 5, 0])
>>> states = [0, 2]
>>> np.in1d(test, states)
array([ True, False,  True, False,  True], dtype=bool)

それを割り当てのマスクとして使用できます。

>>> test[np.in1d(test, states)] = 1
>>> test
array([1, 1, 1, 5, 1])

あなたの問題に当てはまると思われるnumpyのインデックス作成と割り当て構文のより洗練された使用法を次に示します。ifベースのロジックを置き換えるためにビット単位の演算子を使用することに注意してください。

>>> numpy_array = numpy.arange(9).reshape((3, 3))
>>> confused_array = numpy.arange(9).reshape((3, 3)) % 2
>>> mask = numpy.in1d(numpy_array, repeat_set).reshape(numpy_array.shape)
>>> mask
array([[False, False, False],
       [ True, False,  True],
       [ True, False,  True]], dtype=bool)
>>> ~mask
array([[ True,  True,  True],
       [False,  True, False],
       [False,  True, False]], dtype=bool)
>>> numpy_array == 0
array([[ True, False, False],
       [False, False, False],
       [False, False, False]], dtype=bool)
>>> numpy_array != 0
array([[False,  True,  True],
       [ True,  True,  True],
       [ True,  True,  True]], dtype=bool)
>>> confused_array[mask] = 1
>>> confused_array[~mask & (numpy_array == 0)] = 0
>>> confused_array[~mask & (numpy_array != 0)] = 2
>>> confused_array
array([[0, 2, 2],
       [1, 2, 1],
       [1, 2, 1]])

もう 1 つの方法は、 を使用することです。これは、2 番目の引数の値が true であり、3 番目の引数の値が false でnumpy.whereある値を使用して、まったく新しい配列を作成します。(代入と同様に、引数は と同じ形状のスカラーまたは配列にすることができます。) これは上記よりも少し効率的で、確かにより簡潔です。maskmaskmask

>>> numpy.where(mask, 1, numpy.where(numpy_array == 0, 0, 2))
array([[0, 2, 2],
       [1, 2, 1],
       [1, 2, 1]])
于 2012-05-21T18:43:39.790 に答える
1

これがあなたが望むことをする一つの可能​​な方法です:

numpyArray = np.array([1, 8, 35, 343, 23, 3, 8]) # could be n-Dimensional array
repeatSet = np.array([3, 5, 6, 8])
mask = (numpyArray[...,None] == repeatSet[None,...]).any(axis=-1) 
print mask
>>> [False  True False False False  True  True]
于 2012-05-21T18:17:09.327 に答える