【问题标题】:Optimizing function speed on 3D array优化 3D 阵列上的函数速度
【发布时间】:2017-09-18 18:58:26
【问题描述】:

我正在将用户定义的函数应用于 3D 数组的各个单元格。每个单元格的内容都是以下几种可能之一,由于之前的格式化,都是字符向量:

"N"
"A"
""
"1"
"0"

我想创建一个新的相同维度的 3D 数组,其中单元格包含 NA 或包含 1 或 0 的数字向量。因此,我编写了一个名为 Numericize 的函数并使用 aaply 来应用它到整个数组。但是,应用它需要很长时间。

Numericize <- function(x){
  if(!is.na(x)){
    x[x=="N"] <- NA; x
    x[x=="A"] <- NA; x
    x[x==""] <- NA; x
    x <- as.integer(x)
  }
  return(x)
}

原始数组的尺寸为 480x866x366。该函数需要永远使用以下代码来应用:

Final.Daily.Array <- aaply(.data = Complete.Daily.Array,
                           .margins = c(1,2,3),
                           .fun = Numericize,
                           .progress = "text")

我不确定速度问题是来自效率低下的Numericize、效率低下的aaply,还是完全来自其他原因。我考虑尝试使用plyr 包设置并行计算,但我认为这样一个简单的命令不需要并行处理。

一方面我担心我为自己创建了堆栈溢出(请参阅this 了解更多信息),但我已将其他函数应用于类似数组而没有问题。

ex.array <- array(dim = c(3,3,3))

ex.array[,,1] <- c("N","A","","1","0","N","A","","1")
ex.array[,,2] <- c("0","N","A","","1","0","N","A","")
ex.array[,,3] <- c("1","0","N","A","","1","0","N","A")

desired.array <- array(dim = c(3,3,3))

desired.array[,,1] <- c(NA,NA,NA,1,0,NA,NA,NA,1)
desired.array[,,2] <- c(0,NA,NA,NA,1,0,NA,NA,NA)
desired.array[,,3] <- c(1,0,NA,NA,NA,1,0,NA,NA)

ex.array
desired.array

有什么建议吗?

【问题讨论】:

  • 也许只是array(as.numeric(ex.array), dim = dim(ex.array)),因为identical(array(as.numeric(ex.array), dim = dim(ex.array)), desired.array) 是TRUE。
  • 感谢您提供这个优雅简单的答案。这种方法带有一个warning,NA 值是通过强制引入的,但这是可以根据输入和预期输出的结果来预期的。
  • jep,我会忽略该警告(或者记下它,因为它通常很有价值)。

标签: arrays r performance function optimization


【解决方案1】:

您可以只使用矢量化方法:

ex.array[ex.array %in% c("", "N", "A")] <- NA
storage.mode(ex.array) <- "integer"

您可以简单地使用第二行,它将通过强制引入 NA。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多