Сводка
Конвертирует растр в массив NumPy.
Описание
Массив NumPy разработан для работы с очень большими массивами. В языке Python предусмотрено много функций для обработки массивов NumPy, наиболее значимые из них содержатся в пакете SciPy для научных расчетов в среде Python. Может потребоваться конвертировать растр ArcGIS в массив NumPy для
- Использования одной из множества функций Python, которые применяются к массиву NumPy (например, фильтры данных, многомерный анализ или процедуры оптимизации).
- Разработки собственных функций через доступ к отдельным ячейкам массива NumPy (например, для реализации анализа ближайших соседей, изменения значения отдельных ячеек или запуска операторов накопления по всему растру).
Если определение массива (нижний левый угол и число строк и столбцов) превышает экстент in_raster, значениям массива будет присвоено NoData.
Если lower_left_corner не совпадает с углом ячейки, он автоматически будет смещен к нижнему левому углу ближайшей ячейки, следуя тем же правилам, что и параметр среды Snap Raster (Растр привязки). Замыкание в функции RasterToNumPy не противоречит параметру среды Snap Raster (Растр привязки); функция использует только тот же самый механизм. Более подробную информацию смотрите в разделах:
RasterToNumPyArray теперь поддерживает прямое преобразование многоканальных растров в N-мерный массив (ndarray).
- Если экземпляр входного Raster основан на многоканальном растре, то он возвращает ndarray, где длина первого измерения представляет число каналов. Массив ndarray будет иметь измерения (каналы, строки, столбцы).
- Если экземпляр входного Raster базируется на одноканальном растре или отдельном канале многоканального растра, то он возвращает двухмерный массив с измерениями (строки, столбцы).
RasterToNumPyArray Поддерживает непосредственную конвертацию многомерного набора растровых данных в массив NumPy. Выходной массив NumPy – это 3D-массив с размерами [rows, cols, slice_count]. Срезы массива NumPy следуют порядку, указанному в mdRaster.slices
Синтаксис
RasterToNumPyArray (in_raster, {lower_left_corner}, {ncols}, {nrows}, {nodata_to_value})
Parameter | Объяснение | Тип данных |
in_raster | Входной растр, конвертируемый в массив NumPy. | Raster |
lower_left_corner | Нижний левый угол в in_raster, из которого извлекается блок обработки для конвертации в массив. Значения x и y в единицах карты. Если значение не задано, то будет использована начальная точка входного растра. (Значение по умолчанию — None) | Point |
ncols | Число столбцов из lower_left_corner в in_raster для конвертации в массив NumPy. Если значение не задано, то будет использовано количество столбцов входного растра. (Значение по умолчанию — None) | Integer |
nrows | Число строк из lower_left_corner в in_raster для конвертации в массив NumPy. Если значение не задано, то будет использовано количество строк входного растра. (Значение по умолчанию — None) | Integer |
nodata_to_value | Значение для присвоения значений NoData из in_raster в полученный массив NumPy. Если значение не задано, то будет использовано значение NoData из in_raster. (Значение по умолчанию — None) | Variant |
Тип данных | Объяснение |
NumPyArray | Выходной массив NumPy. |
Пример кода
Растр конвертируется в массив NumPy для вычисления процента значения ячейки для каждой строки растра. Затем создается новый растр.
import arcpy
import numpy
# Get input Raster properties
inRas = arcpy.Raster('C:/data/inRaster')
lowerLeft = arcpy.Point(inRas.extent.XMin,inRas.extent.YMin)
cellSize = ras.meanCellWidth
# Convert Raster to numpy array
arr = arcpy.RasterToNumPyArray(inRas,nodata_to_value=0)
# Calculate percentage of the row for each cell value
arrSum = arr.sum(1)
arrSum.shape = (arr.shape[0],1)
arrPerc = (arr)/arrSum
#Convert Array to raster (keep the origin and cellsize the same as the input)
newRaster = arcpy.NumPyArrayToRaster(arrPerc,lowerLeft,cellSize,
value_to_nodata=0)
newRaster.save("C:/output/fgdb.gdb/PercentRaster")
Поблочная обработка входного многоканального растра и расчет статистики для ячеек по каналам. Этот скрипт преобразует многоканальный растр в трехмерный массив NumPy и обрабатывает массив, разделяя его на блоки данных. Затем он вычисляет среднее значений по строкам блока, преобразует разбитый на блоки массив NumPy в растр и объединяет каналы посредством мозаики. Создан новый многоканальный растр.
# Note that, if the input raster is multiband, the data blocks will also be
# multiband, having dimensions (bands, rows, columns). Otherwise, they will
# have dimensions of (rows, columns).
import arcpy
import numpy
import os
# Input raster
filein = os.path.join(os.getcwd(),r"input\input.tif")
# Output raster (after processing)
fileout = os.path.join(os.getcwd(),r"output\blockprocessingrdb22.tif")
# Size of processing data block
# where memorysize = datatypeinbytes * numbands * blocksize^2
blocksize = 512
# ----------------------------------------------------------------------------
# Create raster object from file
myRaster = arcpy.Raster(filein)
# Set environmental variables for output
arcpy.env.overwriteOutput = True
arcpy.env.outputCoordinateSystem = filein
arcpy.env.cellSize = filein
# Loop over data blocks
filelist = []
blocknum = 0
for x in range(0, myRaster.width, blocksize):
for y in range(0, myRaster.height, blocksize):
# Lower left coordinate of block (in map units)
mx = myRaster.extent.XMin + x * myRaster.meanCellWidth
my = myRaster.extent.YMin + y * myRaster.meanCellHeight
# Upper right coordinate of block (in cells)
lx = min([x + blocksize, myRaster.width])
ly = min([y + blocksize, myRaster.height])
# noting that (x, y) is the lower left coordinate (in cells)
# Extract data block
myData = arcpy.RasterToNumPyArray(myRaster, arcpy.Point(mx, my),
lx-x, ly-y)
# PROCESS DATA BLOCK -----------------------------
# e.g., Calculate mean of each cell of all bands.
myData -= numpy.mean(myData, axis=0, keepdims=True)
# ------------------------------------------------
# Convert data block back to raster
myRasterBlock = arcpy.NumPyArrayToRaster(myData, arcpy.Point(mx, my),
myRaster.meanCellWidth,
myRaster.meanCellHeight)
# Save on disk temporarily as 'filename_#.ext'
filetemp = ('_%i.' % blocknum).join(fileout.rsplit('.',1))
myRasterBlock.save(filetemp)
# Maintain a list of saved temporary files
filelist.append(filetemp)
blocknum += 1
# Mosaic temporary files
arcpy.Mosaic_management(';'.join(filelist[1:]), filelist[0])
if arcpy.Exists(fileout):
arcpy.Delete_management(fileout)
arcpy.Rename_management(filelist[0], fileout)
# Remove temporary files
for fileitem in filelist:
if arcpy.Exists(fileitem):
arcpy.Delete_management(fileitem)
# Release raster objects from memory
del myRasterBlock
del myRaster
# ----------------------------------------------------------------------------
Конвертирует многомерный растр в массив NumPy.
# Note that, if the input multidimensional raster is also multiband, the data blocks will have dimensions (bands, rows, columns, slices). Otherwise, they will
# have dimensions of (rows, columns, slices).
import arcpy
import numpy
# Get input multidimensional Raster
in_mdim_raster = arcpy.Raster('C:/data/water_temp.nc', True)
lowerLeft = arcpy.Point(in_mdim_raster.extent.XMin,in_mdim_raster.extent.YMin)
blockSize = 512
# Convert Raster to numpy array
arr = arcpy.RasterToNumPyArray(in_mdim_raster, lower_left_corner = lowerLeft, ncols = blockSize, nrows = blockSize, nodata_to_value=0)
# the shape of the numpy array is [rows, cols, slices]
print(arr.shape)