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)
}

Но я волнуюсь, что порядок операций может не работать, как ожидалось.

Другие вопросы по тегам