Работа с NumPy в ArcGIS
Numerical Python (NumPy) – это основной пакет для экспоненциальных вычислений в Python с поддержкой мощных n-размерных объектов типа массив (array). NumPy – это среда для выполнения сложных математических операций, которая предоставляется в комплекте с программным обеспечением ArcGIS начиная с версии 9.2. Дополнительные сведения см. на веб-сайте NumPy..
Массив Python NumPy предназначен для работы с объемными массивами. В языке Python предусмотрено много функций для обработки массивов NumPy, наиболее значимые из них содержатся в пакете SciPy для экспоненциальных вычислений в средах Python.
Работа с данными таблиц и объектов
Таблицы и классы объектов можно конвертировать в массив NumPy и обратно с помощью функций модуля доступа к данным (arcpy.da).
Операции конвертации массивов NumPy в таблицы и классы объектов можно выполнять только со структурированными массивами. Структурированные массивы содержат поля (структуры), которые используются для сопоставления данных с полями таблиц и классов объектов в ArcGIS. Дополнительные сведения о структурированных массивах см. в разделе Структурированные массивы.
Создайте структурированный массив 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)
Функции | Описание |
---|---|
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 и т. д. |
![Примечание Примечание](rsrc/note.png)
Поля 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 |
![Примечание Примечание](rsrc/note.png)
numpy.nbytes возвращает словарь типов dtype и количество байт.
Работа с растрами
Растры можно конвертировать в массивы NumPy и обратно с помощью функций ArcPy RasterToNumPyArray и NumPyArrayToRaster. Конвертировать растр ArcGIS в массив NumPy может потребоваться для следующих целей:
- Реализация одной из многочисленных функций Python, применимых к массивам NumPy (например, фильтрация данных, многоразмерный анализ, процедуры оптимизации).
- Разработка собственных функций через доступ к отдельным ячейкам массива NumPy (например, для реализации соседней нотации, изменения значения отдельных ячеек или запуска операторов накопления по всему растру).
Функции | Описание |
---|---|
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")