Arbeiten mit NumPy in ArcGIS

Diese ArcGIS 2.6-Dokumentation wurde archiviert und wird nicht mehr aktualisiert. Inhalt und Links sind möglicherweise veraltet. Verwenden Sie die aktuelle Dokumentation.

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