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 Website von NumPy.Externer Link.

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

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)
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, Nullwerte enthalten, sollten die Zeilen mit den Nullwerten entweder komplett übersprungen oder mit einem Ersatzwert maskiert werden.

Überspringen Sie alle Datensätze, die einen NULL-Wert 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

Einzeln

numpy.float32

Double

numpy.float64

SmallInteger

numpy.int32

Integer

numpy.int32

OID

numpy.int32

GUID

<U64

String

<u1, <u10 usw.

HinweisHinweis:

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

HinweisHinweis:

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:

  1. 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).
  2. 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")
5/9/2014