Вопрос по numpy, python – Проверьте, есть ли значения в наборе в массиве numpy в python

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

Ваш Ответ

2   ответа
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]
13

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

Другой подход будет использоватьnumpy.where, который создает новый массив, используя значения из второго аргумента гдеmask верно, и значения из третьего аргумента, гдеmask ложно (Как и в случае присваивания, аргумент может быть скалярным или массивом той же формы, что иmask.) Это может быть немного более эффективно, чем выше, и это, безусловно, более кратко:

>>> numpy.where(mask, 1, numpy.where(numpy_array == 0, 0, 2))
array([[0, 2, 2],
       [1, 2, 1],
       [1, 2, 1]])
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded mkmitchell
Error: User Rate Limit Exceeded mkmitchell
Error: User Rate Limit Exceededin1dError: User Rate Limit ExceededreshapeError: User Rate Limit Exceededtest = np.arange(25).reshape((5, 5))Error: User Rate Limit Exceeded(test[np.in1d(test, states).reshape(test.shape)] == np.array([0, 2])).all() == True.

Похожие вопросы