Arcpy карта алгебры от сетчатой
Я пытаюсь использовать arcpy
от R через reticulate
, По большей части это работает очень хорошо. Тем не менее, я сталкиваюсь с некоторыми проблемами при попытке сделать растровую алгебру. Рассмотрим следующий код:
library(reticulate)
use_python("C:/Python27/ArcGISx6410.2")
arcpy = import("arcpy")
arcpy$CheckOutExtension("Spatial")
arcpy$management$CreateRandomRaster("in_memory",
"randrast", "NORMAL 3.0", "0 0 500 500", 50)
randrast = arcpy$sa$Raster("in_memory/randrast")
doublerast = randrast + randrast
Ошибка в randrast + randrast: не числовой аргумент для бинарного оператора
Кажется, что хотя reticulate
признает, что растры являются объектами Python ("python.builtin.Raster" "python.builtin.object"
), он не знает использовать Python +
оператор, а не Р. Я пытался импортировать arcpy
с convert = FALSE
но ошибка та же.
Я могу обойти это, определив функции Python для имитации основных арифметических операторов.
tmp = tempfile(fileext = ".py")
cat("def add(x, y):\n return x + y\n", file = tmp)
source_python(tmp)
doublerast = add(randrast, randrast)
Но очевидно, что это становится довольно громоздким для более сложных утверждений.
Кто-нибудь знает способ заставить reticulate
использовать арифметические операторы Python для объектов Python, а не R?
1 ответ
Одним из вариантов является определение моих собственных операторов для объектов Python с использованием operator
модуль:
`%py+%` = function(e1, e2) {
op = import("operator")
op$add(e1, e2)
}
doublerast = randrast %py+% randrast
Или, в качестве альтернативы, используйте классы S3 для перегрузки арифметических операторов (как это делается для TensorFlow) для поддержки python.builtin.object
например,
`+.python.builtin.object` = function(e1, e2) {
op = import("operator")
op$add(e1, e2)
}
Но я волнуюсь, что порядок операций может не работать, как ожидалось.