RasterToNumPyArray

Краткая информация

Конвертирует растр в массив NumPy.

Обсуждение

Массив NumPy разработан для работы с очень большими массивами. В языке Python предусмотрено много функций для обработки массивов NumPy, наиболее значимые из них содержатся в пакете SciPy для научных расчетов в среде Python. Может потребоваться конвертировать растр ArcGIS в массив NumPy для

  1. Использования одной из множества функций Python, которые применяются к массиву NumPy (например, фильтры данных, многомерный анализ или процедуры оптимизации).
  2. Разработки собственных функций через доступ к отдельным ячейкам массива NumPy (например, для реализации анализа ближайших соседей, изменения значения отдельных ячеек или запуска операторов накопления по всему растру).

Если определение массива (нижний левый угол и число строк и столбцов) превышает экстент in_raster, значениям массива будет присвоено NoData.

Если lower_left_corner не совпадает с углом ячейки, он автоматически будет смещен к нижнему левому углу ближайшей ячейки, следуя тем же правилам, что и параметр среды Snap Raster (Растр привязки). Замыкание в функции RasterToNumPy не противоречит параметру среды Snap Raster (Растр привязки); функция использует только тот же самый механизм. Более подробную информацию смотрите в разделах:

RasterToNumPyArray теперь поддерживает прямое преобразование многоканальных растров в N-мерный массив (ndarray).

  1. Если экземпляр входного Raster основан на многоканальном растре, то он возвращает ndarray, где длина первого измерения представляет число каналов. Массив ndarray будет иметь измерения (каналы, строки, столбцы).
  2. Если экземпляр входного Raster базируется на одноканальном растре или отдельном канале многоканального растра, то он возвращает двухмерный массив с измерениями (строки, столбцы).

RasterToNumPyArray Поддерживает непосредственную конвертацию многомерного набора растровых данных в массив NumPy. Выходной массив NumPy – это 3D-массив с размерами [rows, cols, slice_count]. Срезы массива NumPy следуют порядку, указанному в mdRaster.slices

Синтаксис

RasterToNumPyArray (in_raster, {lower_left_corner}, {ncols}, {nrows}, {nodata_to_value})
ПараметрОписаниеТип данных
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.

Пример кода

RasterToNumPyArray, пример 1

Растр конвертируется в массив 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 = inRas.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")
RasterToNumPyArray, пример 2

Поблочная обработка входного многоканального растра и расчет статистики для ячеек по каналам. Этот скрипт преобразует многоканальный растр в трехмерный массив 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.management.Mosaic(';'.join(filelist[1:]), filelist[0])
if arcpy.Exists(fileout):
    arcpy.management.Delete(fileout)
arcpy.management.Rename(filelist[0], fileout)

# Remove temporary files
for fileitem in filelist:
    if arcpy.Exists(fileitem):
        arcpy.management.Delete(fileitem)

# Release raster objects from memory
del myRasterBlock
del myRaster
# ----------------------------------------------------------------------------
RasterToNumPyArray, пример 3

Конвертирует многомерный растр в массив 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)

Связанные разделы