Arbeiten mit NumPy in ArcGIS

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-WebsiteExterner Link.

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 arraysExterner Link.

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

FunktionenErklä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.

FeldtypNumPy 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]

Hinweis:

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 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.

TokenBeschreibung

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 dtypeAnzahl der Byte pro Wert

<U1

4

numpy.int32

4

numpy.float32

4

numpy.float64

8

Hinweis:

numpy.nbytes gibt ein Wörterbuch 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. 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

FunktionenErklä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")