NumPy в ArcGIS

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

Массив 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.


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

Short Integer

<i4

Long Integer

<i4

Big Integer

<i8

Float

<f4

Double

<f8

Текст

<u1, <u10 и т.д., в зависимости от длины поля.

Дата

<M8[us]

Object ID

<i8

Guid

<u38

Global ID

<u38

Примечание:

Поля 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 байт памяти для каждого значения массива.
Примечание:

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")