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 zum Arbeiten 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
arr = 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
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 | Erklärung |
---|---|
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.
So können Sie MemoryError-Ausnahmen vermeiden:
- 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. Nach dem Konvertieren eines ArcGIS-Rasters in ein NumPy-Array haben Sie folgende Möglichkeiten:
- 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 verwenden).
- 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 | Erklärung |
---|---|
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")