En esta pregunta de gis.stackexchange se indaga sobre la posibilidad de un algoritmo que permita producir un anillo de ceros (buffer) alrededor de cada cero en un ráster binario (values 0 y 1). Una vía posible para hacer esto es generar todas las tuplas de índices para los cuales se desean los ceros, almacenarlos en una lista (sin repetición) y luego usar esta para cambiar los unos por ceros en una matriz con values 1 generada con la misma dimensión del array original.
La idea es convertir un array de este tipo:
1 0 1 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1
en este otro:
0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1
El código completo es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | import numpy as np #array is a matrix but afterward is easy to convert it in array with numpy array = [[1, 0, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1], [1, 1, 1, 0, 1, 1], [1, 1, 1, 1, 1, 1]] indexes = [] for i, item in enumerate(array): for j, element in enumerate(item): if element == 0: if i-1 >= 0 and j-1 >= 0: tuple = (i-1, j-1) if tuple not in indexes: indexes.append(tuple) if i-1 >= 0 and j >= 0: tuple = (i-1, j) if tuple not in indexes: indexes.append(tuple) if i-1 >= 0 and j+1 >= 0: tuple = (i-1, j+1) if tuple not in indexes: indexes.append(tuple) if i >= 0 and j-1 >= 0: tuple = (i, j-1) if tuple not in indexes: indexes.append(tuple) if i >= 0 and j >= 0: tuple = (i, j) if tuple not in indexes: indexes.append(tuple) if i >= 0 and j+1 >= 0: tuple = (i, j+1) if tuple not in indexes: indexes.append(tuple) if i+1 >= 0 and j-1 >= 0: tuple = (i+1, j-1) if tuple not in indexes: indexes.append(tuple) if i+1 > 0 and j > 0: tuple = (i+1, j) if tuple not in indexes: indexes.append(tuple) if i+1 > 0 and j+1 > 0: tuple = (i+1, j+1) if tuple not in indexes: indexes.append(tuple) buffered_array = [[1 for i in range(len(array[0]))] for i in range(len(array))] for index in indexes: buffered_array[index[0]][index[1]] = 0 print np.array(buffered_array) |
Después de ejecutado en la Python Console de QGIS se obtiene el array esperado:
[[0 0 0 1 1 1] [0 0 0 1 1 1] [0 0 0 0 0 1] [0 0 0 0 0 1] [1 1 0 0 0 1]]
No hay comentarios:
Publicar un comentario