Работа с NumPy в ArcGIS

Numerical Python (NumPy) – это основной пакет для экспоненциальных вычислений в Python с поддержкой мощных n-размерных объектов типа массив (array). NumPy – это среда для выполнения сложных математических операций, которая предоставляется в комплекте с программным обеспечением ArcGIS начиная с версии 9.2. Дополнительные сведения см. на веб-сайте NumPy.External link.

Массив Python NumPy предназначен для работы с объемными массивами. В языке Python предусмотрено много функций для обработки массивов NumPy, наиболее значимые из них содержатся в пакете SciPy для экспоненциальных вычислений в средах Python.

Работа с данными таблиц и объектов

Таблицы и классы объектов можно конвертировать в массив NumPy и обратно с помощью функций модуля доступа к данным (arcpy.da).

Операции конвертации массивов NumPy в таблицы и классы объектов можно выполнять только со структурированными массивами. Структурированные массивы содержат поля (структуры), которые используются для сопоставления данных с полями таблиц и классов объектов в ArcGIS. Дополнительные сведения о структурированных массивах см. в разделе Структурированные массивыExternal link.

Создайте структурированный массив NumPy.

import numpy

array = numpy.array([(471316.383, 5000448.782), (470402.493, 5000049.216)],
                    numpy.dtype([('X', '>f8'),('Y', '>f8')]))

После этого структурированный массив NumPy можно конвертировать в класс пространственных объектов или таблицу.

Сконвертируйте массив NumPy в класс объектов базы геоданных.

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 для работы с данными таблиц и объектов

Функции

Описание

ExtendTable

Позволяет соединять содержимое структурированного массива NumPy с другой таблицей на основе общего поля атрибутов.

FeatureClassToNumPyArray

Позволяет конвертировать класс объектов в структурированный массив NumPy.

NumPyArrayToFeatureClass

Позволяет конвертировать структурированный массив NumPy в класс объектов.

NumPyArrayToTable

Позволяет конвертировать структурированный массив NumPy в таблицу.

TableToNumPyArray

Позволяет конвертировать таблицу в структурированный массив NumPy.

Целочисленные поля в массивах NumPy не поддерживают значение NULL. Если в данных, преобразуемых с помощью функций FeatureClassToNumPyArray или TableToNumPyArray содержатся значения NULL, строки с этими значениями должны быть либо пропущены, либо "замаскированы" с помощью замещающего значения.

Пропустить все записи со значениями NULL.

array = da.FeatureClassToNumPyArray(fc, fields, skip_nulls=True)

C помощью словаря замаскируйте другими значениями все значения Нет (None) в целочисленных полях.

fields = ['field1', 'field2']
arcpy.da.FeatureClassToNumPyArray(fc, fields, null_value=-9999)

Конвертация типов

Типы dtype созданного массива определяются типом полей входной таблицы или входного класса объектов.

Тип поля

Тип dtype массива NumPy

Single

numpy.float32

Double

numpy.float64

SmallInteger

numpy.int32

Integer

numpy.int32

OID

numpy.int32

GUID

<U64

String

<u1, <u10 и т. д.

ПримечаниеПримечание:

Поля string, сконвертированные в массив, будут иметь такую же ширину. Например, поле string с шириной 20 будет иметь dtype <u20.

Поля других типов, не перечисленных выше, а также поля даты, растра и типа BLOB не поддерживаются. Поля геометрии также не поддерживаются, но в массив можно добавлять разные свойства геометрии с помощью перечисленных ниже маркеров

Маркер

Описание

SHAPE@XY

Координаты X,Y центроида пространственного объекта

SHAPE@TRUECENTROID

Координаты X,Y истинного центроида пространственного объекта

SHAPE@X

Координата объекта по оси X

SHAPE@Y

Координата объекта по оси Y

SHAPE@Z

Координата объекта по оси Z

SHAPE@M

Значение M объекта

SHAPE@AREA

Площадь объекта

SHAPE@LENGTH

Длина объекта

Об использовании памяти

Модуль NumPy предварительно резервирует память при создании массива. Если для массива памяти недостаточно, массив не будет создан, а процедура вернет исключение MemoryError.

Во избежание исключений типа MemoryError выполните следующие действия:

  • По завершении работы с массивом удалите его. В результате память будет освобождена.
  • Работайте только с теми полями, которые вам нужны. Особенно это релевантно для полей текстового типа, в которых при конвертации в массив каждый символ будет занимать 4 байта. Например, при конвертации строкового поля шириной 100 символов, каждое его значение будет занимать 400 байт памяти.

Тип dtype массива NumPy

Количество байт для значения

<U1

4

numpy.int32

4

numpy.float32

4

numpy.float64

8

ПримечаниеПримечание:

numpy.nbytes возвращает словарь типов dtype и количество байт.

Работа с растрами

Растры можно конвертировать в массивы NumPy и обратно с помощью функций ArcPy RasterToNumPyArray и NumPyArrayToRaster. Конвертировать растр ArcGIS в массив NumPy может потребоваться для следующих целей:

  1. Реализация одной из многочисленных функций Python, применимых к массивам NumPy (например, фильтрация данных, многоразмерный анализ, процедуры оптимизации).
  2. Разработка собственных функций через доступ к отдельным ячейкам массива NumPy (например, для реализации соседней нотации, изменения значения отдельных ячеек или запуска операторов накопления по всему растру).

Функции arcpy для работы с растрами

Функции

Описание

RasterToNumPyArray

Позволяет конвертировать растр в массив NumPy.

NumPyArrayToRaster

Позволяет конвертировать массив NumPy в растр.

Растр конвертируется в массив NumPy для вычисления доли значения ячейки в строке растра. Затем создается новый растр.

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")
9/11/2013