Numerical Python (NumPy) es un paquete fundamental para el cálculo científico en Python, e incluye compatibilidad con un potente objeto de conjunto N dimensional. NumPy proporciona una avenida para realizar operaciones matemáticas complejas y ha sido parte del software de instalación de ArcGIS desde la versión 9.2. Consulte el sitio web de NumPy para obtener más información.
Un conjunto Python NumPy está diseñado para manejar conjuntos grandes. Hay muchas funciones de Python existentes que fueron creadas para procesar conjuntos NumPy, la mayoría que se han observado están incluidas en el paquete de cálculo científico de SciPy de Python.
Trabajar con datos de entidad y tablas
Las clases de entidad y tabla se pueden convertir a y de los conjuntos NumPy al utilizar las funciones en el módulo de acceso de datos (arcpy.da).
Para convertir conjuntos NumPy a clases de entidad y tablas, los conjuntos deben ser conjuntos estructurados. Los conjuntos estructurados incluyen campos (o estructuras) que se utilizan para representar los datos en el campo en las clases de entidad y tabla de ArcGIS. Para obtener más información sobre conjuntos estructurados, consulte Conjuntos estructurados.
Crear un conjunto estructurado NumPy.
import numpy
arr = numpy.array([(471316.383, 5000448.782), (470402.493, 5000049.216)],
numpy.dtype([('X', '>f8'),('Y', '>f8')]))
Una vez lo haya creado, un conjunto estructurado NumPy se puede convertir en una clase de entidad o tabla.
Convertir un conjunto NumPy a una clase de entidad de geodatabase.
import arcpy
import numpy
out_fc = 'C:/data/texas.gdb/fd/pointlocations'
# Create a numpy array with an id field, and a field with a tuple
# of x,y coordinates
arr = numpy.array([(1, (471316.3835861763, 5000448.782036674)),
(2, (470402.49348005146, 5000049.216449278))],
numpy.dtype([('idfield', numpy.int32),('XY', '<f8', 2)]))
# Define a spatial reference for the output feature class
spatial_ref = arcpy.Describe('C:/data/texas.gdb/fd').spatialReference
# Export the numpy array to a feature class using the XY field to
# represent the output point feature
arcpy.da.NumPyArrayToFeatureClass(arr, out_fc, ['XY'], spatial_ref)
Funciones arcpy.da para trabajar con datos de entidad y tablas
Funciones | Explicación |
---|---|
ExtendTable | Una el contenido de un conjunto estructurado NumPy a una tabla basándose en un campo de atributos común. |
FeatureClassToNumPyArray | Convertir una clase de entidad a un conjunto estructurado NumPy. |
NumPyArrayToFeatureClass | Convertir un conjunto estructurado NumPy a una clase de entidad. |
NumPyArrayToTable | Convertir un conjunto estructurado NumPy a una tabla. |
TableToNumPyArray | Convertir una tabla a conjunto estructurado NumPy. |
Los campos de enteros en conjuntos NumPy no son compatible con valores nulos. Si los datos que se convirtieron utilizando FeatureClassToNumPyArray o TableToNumPyArray contienen valores nulos, las filas que incluyen los valores nulos deben omitirse totalmente u ocultarse con un valor substituto.
Omitir todos los registros que incluyen un valor nulo.
arr = arcpy.da.FeatureClassToNumPyArray(fc, fields, skip_nulls=True)
Máscara Nones en los campos de enteros con valores diferentes utilizando un diccionario.
fields = ['field1', 'field2']
arcpy.da.FeatureClassToNumPyArray(fc, fields, null_value=-9999)
Tipo de conversiones
La dtypes del conjunto creado están determinados por el tipo de campo de la tabla de entrada o clase de entidad.
Tipo de campo | NumPy dtype |
---|---|
Single | numpy.float32 |
Double | numpy.float64 |
SmallInteger | numpy.int32 |
Integer | numpy.int32 |
OID | numpy.int32 |
GUID | <U64 |
String | <u1, <u10, y así sucesivamente |
Otros tipos de campo no mencionados anteriormente, incluida la fecha, ráster y los campos BLOB no son compatibles. Los campos de geometría tampoco no compatibles, pero varias propiedades de geometría se pueden agregar al conjunto mediante las fichas especiales que se enumeran a continuación.
Token | Descripción |
---|---|
SHAPE@XY | Coordenadas x,y centroide de la entidad |
SHAPE@TRUECENTROID | Coordenadas x,y centroide verdadero de la entidad |
SHAPE@X | Coordenada x de la entidad |
SHAPE@Y | Coordenada y de la entidad |
SHAPE@Z | Coordenada z de la entidad |
SHAPE@M | Valor m de la entidad |
SHAPE@AREA | Área de la entidad |
SHAPE@LENGTH | Longitud de la entidad |
Consideraciones de la memoria
NumPy asigna previamente la memoria cuando se crean conjuntos. Un conjunto que requiere más memoria de la que está disponible fallará con una excepción MemoryError.
Sugerencias para evitar las excepciones MemoryError:
- Eliminar el conjunto de objetos después de utilizar; eliminar el conjunto liberará la memoria.
- Utilice sólo los campos que necesita, especialmente los campos de texto; un campo de texto convertido en conjunto consumirá 4 bytes por cada carácter de ancho. Por ejemplo, un campo de cadena de caracteres con un ancho de 100 consumirán 400 bytes de memoria para cada valor en el conjunto.
NumPy dtype | Cantidad de bytes por valor |
---|---|
<U1 | 4 |
numpy.int32 | 4 |
numpy.float32 | 4 |
numpy.float64 | 8 |
Trabajar con rásteres
El ráster se puede convertir a y desde conjuntos NumPy utilizando las funciones RasterToNumPyArray y NumPyArrayToRaster de ArcPy. Es posible que desee convertir un ráster de ArcGIS a un conjunto NumPy para:
- Implementar una de las distintas funciones Python existentes que se pueden aplicar a un conjunto NumPy (por ejemplo, ejecutar filtros en los datos, realizar un análisis multidimensional o utilizar rutinas de optimización).
- Desarrollar una función personalizada al obtener acceso a las celdas individuales dentro el conjunto NumPy (por ejemplo, para implementar notaciones de vecindad, cambiar valores de celdas individuales o ejecutar operadores acumulativos en un ráster completo).
Funciones arcpy para trabajar con rásteres
Funciones | Explicación |
---|---|
RasterToNumPyArray | Convertir un ráster en un conjunto NumPy. |
NumPyArrayToRaster | Convierte un conjunto NumPy en un ráster. |
Un ráster se convierte en un conjunto NumPy para calcular el porcentaje del valor de la celda en la fila completa del ráster. Se crea entonces un nuevo ráster.
import arcpy
import numpy
my_array = arcpy.RasterToNumPyArray('C:/data/inRaster')
my_array_sum = my_array.sum(1)
my_array_sum.shape = (my_array.shape[0], 1)
my_array_perc = (my_array * 1.0) / my_array_sum
new_raster = arcpy.NumPyArrayToRaster(my_array_perc)
new_raster.save("C:/output/fgdb.gdb/PercentRaster")