Работа с NumPy в ArcGIS

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

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

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

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

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

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

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

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

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

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

ФункцииОбъяснение
ExtendTable

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

FeatureClassToNumPyArray

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

NumPyArrayToFeatureClass

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

NumPyArrayToTable

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

TableToNumPyArray

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

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

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

arr = arcpy.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 и так далее

Date

<M8[us]

Примечание:

Поля 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

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

Вопросы памяти

Если массив требует больше памяти, чем доступно, появится ошибка с исключением 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 для выполнения следующего:

  • Использования одной из множества функций Python, которые применяются к массиву NumPy (например, фильтры данных, многомерный анализ или процедуры оптимизации).
  • Разработки собственных функций через доступ к отдельным ячейкам массива 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")