计算数组的行max和索引

时间:2015-11-24 10:57:16

标签: arrays r max apply min

假设我有一个维度数组(i,j,k),我想遍历维度k并计算每个矩阵(i,j)行max和行索引。我怎么能避免双重应用功能。双重应用的问题在于它很慢,因为它无法有效地创建结果矩阵,例如:

    Array <- rnorm(10000000)
dim(Array) <- c(1, 10000000,1)
system.time(apply(Array, 3, function(x)apply(x,1,function(y)c(min(y), max(y), which.min(y), which.max(y))))) 
system.time(apply(Array, 3, rowRanges))
system.time(apply(Array, 3, function(y)c(min(y), max(y), which.min(y), which.max(y)))) 

如何避免双重应用功能,是否可以更有效地计算最小值和最大值的位置?在这个例子中,数组是一个向量,但在现实生活中它是一个真正的数组

示例更多的是证明apply函数会导致开销。范围函数仅计算最小值和最大值,而不计算指数。这里是我想要优化的真实示例(请注意,示例中的第一个索引10位于reallife 1500左右,但数组大约为16 gb)

Array <- rnorm(35000*36*10)
dim(Array) <- c(10, 35000,36)
test1 <- apply(Array, 3, function(x)apply(x,1,function(y)c(min(y), max(y), which.min(y), which.max(y))))
dim(test1) <- c(4, 10,36)
test2 <- apply(Array, 3, rowRanges)
dim(test2) <- c(10,2,36)
test2 <- aperm(test2, c(2,1,3))
sum(!test2 == test1[1:2,,])

0 个答案:

没有答案