Numerical Python (NumPy) ist ein grundlegendes Paket für wissenschaftliche Berechnungen in Python und unterstützt u. a. ein leistungsstarkes n-dimensionales Array-Objekt. NumPy ermöglicht es, komplexe mathematische Operationen auszuführen, und ist seit ArcGIS 9.2 Teil der Software-Installation. Weitere Informationen finden Sie auf der NumPy-Website.
Das NumPy-Array von Python wurde für den Umgang mit großen Arrays entwickelt. Viele vorhandene Python-Funktionen wurden für die Verarbeitung von NumPy-Arrays erstellt. Die am häufigsten verwendeten sind im SciPy-Paket für wissenschaftliche Berechnungen von Python enthalten.
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')]))
Once created, a structured NumPy array can be converted to a feature class or table.
Convert a NumPy array to a geodatabase feature class.
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)
arcpy.da-Funktionen zum Arbeiten mit Tabellen und Feature-Daten
Funktionen | Erläuterung |
---|---|
ExtendTable | Verbinden Sie den Inhalt eines strukturierten NumPy-Arrays auf der Grundlage eines gemeinsamen Attributfeldes mit einer Tabelle. |
FeatureClassToNumPyArray | Konvertieren Sie eine Feature-Class in ein strukturiertes NumPy-Array. |
NumPyArrayToFeatureClass | Konvertieren Sie ein strukturiertes NumPy-Array in eine Feature-Class. |
NumPyArrayToTable | Konvertieren Sie ein strukturiertes NumPy-Array in eine Tabelle. |
TableToNumPyArray | Konvertieren Sie eine Tabelle in ein strukturiertes NumPy-Array. |
Ganzzahlfelder in NumPy-Arrays unterstützen keine NULL-Werte. Wenn Daten, die mit FeatureClassToNumPyArray oder TableToNumPyArray konvertiert wurden, NULL-Werte enthalten, sollten die Zeilen mit den NULL-Werten entweder komplett übersprungen oder mit einem Ersatzwert maskiert werden.
Überspringen Sie alle Datensätze, die einen NULL-Wert enthalten.
arr = arcpy.da.FeatureClassToNumPyArray(fc, fields, skip_nulls=True)
Maskieren Sie Ganzzahlfelder mit dem Eintrag "None" durch verschiedene Werte mithilfe eines Wörterbuchs.
fields = ['field1', 'field2']
arcpy.da.FeatureClassToNumPyArray(fc, fields, null_value=-9999)
Typkonvertierungen
Die "dtypes" des erstellten Arrays werden anhand des Feldtyps der Eingabetabelle oder Feature-Class bestimmt.
Feldtyp | NumPy dtype |
---|---|
Single | numpy.float32 |
Double | numpy.float64 |
SmallInteger | numpy.int32 |
Integer | numpy.int32 |
OID | numpy.int32 |
GUID | <U64 |
String | <u1, <u10 usw. |
Date | <M8[us] |
Andere Feldtypen, die oben nicht aufgeführt sind, einschließlich Raster- und BLOB-Felder, werden nicht unterstützt. Geometriefelder werden ebenfalls nicht unterstützt. Mit den unten aufgeführten speziellen Tokens können Sie dem Array jedoch mehrere Geometrieeigenschaften hinzufügen.
Token | Beschreibung |
---|---|
SHAPE@XY | Die XY-Koordinaten des Feature-Schwerpunktes |
SHAPE@TRUECENTROID | Die XY-Koordinaten des tatsächlichen Feature-Schwerpunktes |
SHAPE@X | Die X-Koordinate des Features |
SHAPE@Y | Die Y-Koordinate des Features |
SHAPE@Z | Die Z-Koordinate des Features |
SHAPE@M | Der M-Wert des Features |
SHAPE@AREA | Die Fläche des Features |
SHAPE@LENGTH | Die Länge des Features |
Überlegungen zum Speicher
Ein Array, das mehr als den verfügbaren Speicherplatz benötigt, schlägt mit der Ausnahme MemoryError fehl.
Tipps zur Vermeidung von MemoryError-Ausnahmen:
- Löschen Sie Array-Objekte nach der Verwendung, um Speicherplatz freizugeben.
- Verwenden Sie nur die benötigten Felder, insbesondere Textfelder. In einen Array konvertierte Textfelder belegen 4 Byte für jedes Zeichen der Breite. Ein Zeichenfolgefeld mit einer Breite von 100 belegt beispielsweise 400 Byte Speicherplatz für jeden Wert im Array.
NumPy dtype | Anzahl der Byte pro Wert |
---|---|
<U1 | 4 |
numpy.int32 | 4 |
numpy.float32 | 4 |
numpy.float64 | 8 |
Arbeiten mit Rastern
Raster können mit den ArcPy-Funktionen RasterToNumPyArray und NumPyArrayToRaster in bzw. aus NumPy-Arrays konvertiert werden. Gründe für das Konvertieren eines ArcGIS-Rasters in ein NumPy-Array:
- Implementieren Sie eine der vielen vorhandenen Python-Funktionen, die auf ein NumPy-Array angewendet werden können (z. B. Daten filtern, mehrdimensionale Analysen ausführen oder Optimierungsroutinen nutzen).
- Entwickeln Sie eine benutzerdefinierte Funktion, indem Sie auf die einzelnen Zellen innerhalb des NumPy-Arrays zugreifen (um z. B. Nachbarschaftsnotationen zu implementieren, einzelne Zellenwerte zu ändern oder kumulative Operatoren für ein ganzes Raster auszuführen).
ArcPy-Funktionen für das Arbeiten mit Rastern
Funktionen | Erläuterung |
---|---|
RasterToNumPyArray | Konvertieren Sie ein Raster in ein NumPy-Array. |
NumPyArrayToRaster | Konvertieren Sie ein NumPy-Array in ein Raster. |
Ein Raster wird in ein NumPy-Array konvertiert, um den Prozentsatz des Zellenwertes in der ganzen Raster-Zeile zu berechnen. Anschließend wird ein neues Raster erstellt.
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")