Работа с NumPy в ArcGIS

Numerical Python (NumPy) – это основной пакет для экспоненциальных вычислений в Python с поддержкой мощных n-размерных объектов типа массив. NumPy позволяет выполнять сложные математические операции и, начиная с версии 9.2, предоставляется в комплекте с программным обеспечением ArcGIS. Дополнительные сведения см. на веб-сайте 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@XYZ

Кортеж x, y, z координат центроида объекта.

SHAPE@TRUECENTROID

Кортеж x, y координат центроида объекта. Выдает такой же результат, что и SHAPE@XY.

SHAPE@X

Значение двойной точности координаты х объекта.

SHAPE@Y

Значение двойной точности координаты y объекта.

SHAPE@Z

Значение двойной точности координаты z объекта.

SHAPE@M

Значение двойной точности m для объекта.

SHAPE@JSON

Строка Esri JSON, представляющая геометрию.

SHAPE@WKB

Стандартное двоичное (well-known binary, WKB) представление для геометрии OGC. Он обеспечивает портативное представление значения геометрии в виде непрерывного потока байтов.

SHAPE@WKT

Стандартное текстовое (well-known text, WKT) представление для геометрии OGC. Он обеспечивает портативное представление значения геометрии в виде текстовой строки.

SHAPE@AREA

Значение двойной точности для площади объекта.

SHAPE@LENGTH

Значение двойной точности для длины объекта.

OID@

Значение поля Object ID.

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

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