array_reshape() со странным поведением

#r #keras #reticulate

#r #keras #сетчатый

Вопрос:

для изменения формы массива я использую array_reshape() из пакета reticulate. Для некоторых целей мне нужен предварительно выделенный массив, состоящий только из NA. Теперь давайте посмотрим, что делает array_reshape().

 data <- c(NA, NA, NA)
a <- as.array(data)
a <- reticulate::array_reshape(a, dim = c(1L, 1L, 3L), order = "F")
  

Результатом a является:

 logi[1, 1, 1:3] TRUE TRUE TRUE
  

Чтобы получить сравнение для этого столбца-основной стиль упорядочения (в стиле Fortran), использование dim() приводит к другому результату

 data <- c(NA, NA, NA)
a <- as.array(data)
dim(a) <- c(1L, 1L, 3L)
  

Результат a является ожидаемым:

 logi[1, 1, 1:3] NA NA NA
  

После дальнейших тестов я обнаружил, что NA переводится в TRUE, если в массиве нет числового или буквенно-цифрового (например, символьного) значения. Если, например, числовое значение находится в массиве, все работает так, как ожидалось

 data <- c(NA, NA, 3)
a <- as.array(data)
a <- reticulate::array_reshape(a, dim = c(1L, 1L, 3L), order = "F")
  
 logi[1, 1, 1:3] NA NA 3
  

Но, если использовать логические значения и в массиве, результат будет

 data <- c(NA, NA, FALSE)
a <- as.array(data)
a <- reticulate::array_reshape(a, dim = c(1L, 1L, 3L), order = "F")
  
 logi[1, 1, 1:3] TRUE TRUE FALSE
  

На мой взгляд, это очень «опасно», потому что позже невозможно будет сделать различие, является ли исходное значение NA или логическим TRUE. Использование dim() всегда приводит к ожидаемым результатам.

PS: Я знаю, что внутренне NA обрабатывается как логическая константа длиной 1.

Есть ли у вас какие-либо подсказки или предложения по решению этой проблемы с изменением формы с помощью array_reshape ()?

Заранее спасибо

Комментарии:

1. Это может иметь отношение github.com/rstudio/reticulate/issues/197 и data <- c(NA_real_, NA_real_, NA_real_) выдает ожидаемое, но затем data <- c(NA_real_, NA_real_, FALSE) преобразует FALSE в 0 , и data <- c(NA_integer_, NA_integer_, NA_integer_) это не очень хорошо.

2. Спасибо за ваш ответ и предоставленную вами ссылку.