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 |
Text | <u1, <u10 и т.д., в зависимости от длины поля |
Дата | <M8[s] или <M8[us], в зависимости от точности поля |
Только дата | <M8[D] |
Только время | <m8[us] или <m8[us] |
Сдвиг метки времени | <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")