Compruebe si los valores de un conjunto están en una matriz numpy en python

Quiero verificar si un NumPyArray tiene valores en él que están en un conjunto, y si es así, establezca esa área en una matriz = 1. Si no establece un keepRaster = 2.

numpyArray = #some imported array repeatSet= ([3, 5, 6, 8]) confusedRaster = numpyArray[numpy.where(numpyArray in repeatSet)]= 1 

Rendimientos:

 : unhashable type: 'numpy.ndarray' 

¿Hay una manera de recorrerlo?

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

Para aclarar y pedir un poco más de ayuda:

Lo que estoy tratando de conseguir, y lo que estoy haciendo actualmente, es poner una entrada ráster en una matriz. Necesito leer valores en la matriz 2-d y crear otra matriz basada en esos valores. Si el valor de la matriz está en un conjunto, entonces el valor será 1. Si no está en un conjunto, el valor se derivará de otra entrada, pero diré 77 por ahora. Esto es lo que estoy usando actualmente. Mi entrada de prueba tiene aproximadamente 1500 filas y 3500 columnas. Siempre se congela alrededor de la fila 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 

En las versiones 1.4 y superiores, numpy proporciona la función in1d .

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

Puedes usar eso como una máscara para la asignación.

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

Aquí hay algunos usos más sofisticados de la syntax de asignación e indexación de Numpy que creo que se aplicarán a su problema. Tenga en cuenta el uso de operadores bitwise para reemplazar la lógica basada en 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]]) 

Otro enfoque sería utilizar numpy.where , que crea una matriz completamente nueva, utilizando los valores del segundo argumento donde la mask es verdadera y los valores del tercer argumento donde la mask es falsa. (Al igual que con la asignación, el argumento puede ser un escalar o una matriz de la misma forma que la mask .) Esto podría ser un poco más eficiente que el anterior, y ciertamente es más conciso:

 >>> numpy.where(mask, 1, numpy.where(numpy_array == 0, 0, 2)) array([[0, 2, 2], [1, 2, 1], [1, 2, 1]]) 

Aquí hay una forma posible de hacer lo que quieras:

 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]