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 forma de 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.
La matriz Python NumPy se diseña para trabajar con 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.
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 más información sobre conjuntos estructurados, veaConjuntos 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 en una matriz estructurada 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 en una matriz estructurada NumPy. |
Los campos de tipo entero en matrices NumPy no son compatibles 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.
Estas son algunas 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
Los rásteres se pueden convertir a matrices NumPy y desde ellas utilizando las funciones RasterToNumPyArray y NumPyArrayToRaster de ArcPy. Es posible que desee convertir un ráster de ArcGIS a una matriz NumPy para realizar lo siguiente:
- Implementar una de las distintas funciones de Python existentes que se pueden aplicar a una matriz 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")