Estoy interesado en aprender a utilizar matrices NumPy para optimizar el geoprocesamiento. Gran parte de mi trabajo implica "big data", donde el geoprocesamiento a menudo lleva días para realizar ciertas tareas. No hace falta decir que estoy muy interesado en optimizar estas rutinas. ArcGIS 10.1 tiene una serie de funciones NumPy a las que se puede acceder a través de arcpy, que incluyen:
Por ejemplo, supongamos que quiero optimizar el siguiente flujo de trabajo intensivo de procesamiento utilizando matrices NumPy:
La idea general aquí es que hay una gran cantidad de puntos basados en vectores que se mueven a través de operaciones basadas en vectores y ráster, lo que da como resultado un conjunto de datos ráster entero binario.
¿Cómo podría incorporar matrices NumPy para optimizar este tipo de flujo de trabajo?
Respuestas:
Creo que el quid de la cuestión aquí es qué tareas en su flujo de trabajo no dependen realmente de ArcGIS. Los candidatos obvios incluyen operaciones tabulares y de trama. Si los datos deben comenzar y finalizar dentro de un gdb o algún otro formato ESRI, entonces debe descubrir cómo minimizar el costo de este reformateo (es decir, minimizar el número de viajes de ida y vuelta) o incluso justificarlo, simplemente podría ser demasiado caro de racionalizar. Otra táctica es modificar su flujo de trabajo para usar modelos de datos compatibles con Python antes (por ejemplo, ¿qué tan pronto podría deshacerse de los polígonos vectoriales?).
Para hacer eco a @gene, aunque numpy / scipy son realmente geniales, no asuma que estos son los únicos enfoques disponibles. También puede usar listas, conjuntos, diccionarios como estructuras alternativas (aunque el enlace de @ blah238 es bastante claro sobre los diferenciales de eficiencia), también hay generadores, iteradores y todo tipo de otras herramientas excelentes, rápidas y eficientes para trabajar estas estructuras en Python. Raymond Hettinger, uno de los desarrolladores de Python, tiene todo tipo de excelente contenido general de Python. Este video es un buen ejemplo .
Además, para agregar a la idea de @ blah238 sobre el procesamiento multiplexado, si está escribiendo / ejecutando dentro de IPython (no solo el entorno python "normal"), puede usar su paquete "paralelo" para explotar múltiples núcleos. No soy un genio con estas cosas, pero me parece un poco más alto / amigable para los novatos que las cosas de multiprocesamiento. Probablemente sea solo un tema de religión personal allí, así que tómalo con un grano de sal. Hay una buena descripción al respecto a partir de las 2:13:00 en este video . Todo el video es excelente para IPython en general.
fuente