Arbeiten mit NumPy in ArcGIS
Numerical Python (NumPy) ist ein wesentliches 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 Website von NumPy..
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.
Arbeiten mit Tabellen und Feature-Daten
Tabellen und Feature-Classes können mit Funktionen im Datenzugriffsmodul (arcpy.da) in und aus NumPy-Arrays konvertiert werden.
Um NumPy-Arrays in Tabellen und Feature-Classes zu konvertieren, muss es sich bei den Arrays um strukturierte Arrays handeln. Strukturierte Arrays umfassen Felder (oder Strukturen), mit denen die Daten den Feldern in ArcGIS-Tabellen und Feature-Classes zugeordnet werden. Weitere Informationen zu strukturierten Arrays finden Sie unter Structured Arrays.
Erstellen Sie ein strukturiertes NumPy-Array.
import numpy
array = numpy.array([(471316.383, 5000448.782), (470402.493, 5000049.216)],
numpy.dtype([('X', '>f8'),('Y', '>f8')]))
Nachdem ein strukturiertes NumPy-Array erstellt wurde, kann es in eine Feature-Class oder eine Tabelle konvertiert werden.
Konvertieren Sie ein NumPy-Array in eine Geodatabase-Feature-Class.
import arcpy
import numpy
outFC = "C:/data/texas.gdb/fd/pointlocations"
# Create a numpy array with an id field, and a field with a tuple
# of x,y coordinates
#
array = 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
#
SR = 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(array, outFC, ['XY'], SR)
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 Nullwerte. Wenn Daten, die mit FeatureClassToNumPyArray oder TableToNumPyArray konvertiert wurden, Nullwerte enthalten, sollten die Zeilen mit den Nullwerten entweder komplett übersprungen oder mit einem Ersatzwert maskiert werden.
Überspringen Sie alle Datensätze, die einen Nullwert enthalten.
array = 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. |
Zeichenfolgefelder, die in einen Array konvertiert wurden, haben die gleiche Breite. Ein Zeichenfolgefeld mit einer Breite von 20 hat beispielsweise einen dtype von <u20.
Andere Feldtypen, die oben nicht aufgeführt sind, einschließlich Datums-, 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
NumPy weist beim Erstellen von Arrays vorab Speicher zu. 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 |
numpy.nbytes gibt ein Dictionary mit dtypes und der Anzahl der Byte zurück.
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).
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
myArray = arcpy.RasterToNumPyArray('C:/data/inRaster')
myArraySum = myArray.sum(1)
myArraySum.shape = (myArray.shape[0],1)
myArrayPerc = (myArray * 1.0)/ myArraySum
newRaster = arcpy.NumPyArrayToRaster(myArrayPerc)
newRaster.save("C:/output/fgdb.gdb/PercentRaster")