Работа с 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

Одинарной точности

numpy.float32

Число двойной точности

numpy.float64

SmallInteger

numpy.int32

Целочисленное (Integer)

numpy.int32

OID

numpy.int32

GUID

<U64

Строка

<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 возвратит словарь (dictionary) значений dtypes и числа байт.

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

Растры можно конвертировать в массивы NumPy и обратно, используя функции ArcPy RasterToNumPyArray и NumPyArrayToRaster. Может потребоваться конвертировать растр ArcGIS в массив NumPy для:

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

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

Функции

Описание

RasterToNumPyArray

Конвертирует растр в массив NumPy.

NumPyArrayToRaster

Конвертирует массив NumPy в растр.

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

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/10/2014