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. Para más información, vea el sitio Web de NumPy.
Un conjunto Python NumPy está diseñado para manejar conjuntos grandes. Hay muchas funciones de Phyton 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.
Working with tables and feature data
Table and feature classes can be converted to and from NumPy arrays using functions in the data access (arcpy.da) module.
To convert NumPy arrays to tables and feature classes, the arrays must be structured arrays. Structured arrays include fields (or structs) that are used to map the data to field in ArcGIS table and feature classes. For more information on structured arrays, see Structured arrays.
Create a structured NumPy array.
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 sustituto.
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 |
Date | <M8[us] |
Otros tipos de campos no mencionados anteriormente, incluidos los campos ráster y 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 | La 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 | La longitud de la entidad |
Consideraciones de la memoria
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 | La 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")