我想为栅格砖的每个像元(+50层,70,000,000个像元)计算一些统计数据,例如中位数。这小段代码正在运行,但是速度却非常慢...:
r <- raster(ncol=3000, nrow=2000)
r[] <- rnorm(n=ncell(r))
s <- stack(x=c(r, r*2, r))
file <- brick(x=c(r, r*2, r))
q25 <- file[[1]]
i=0
for(i in 1:ncell(file)){
progress(i, max.value = ncell(file))
q25[i] <- unname(quantile(file[i],.5,na.rm=TRUE))
}
q25是一个栅格图层(与“文件”完全相同),但只有一个图层(不是砖)。
我很乐意提出任何加快速度的建议。
谢谢!
答案 0 :(得分:2)
避免循环循环,因为它太慢了。
示例数据
library(raster)
r <- raster(ncol=300, nrow=200)
set.seed(1)
values(r) <- rnorm(n=ncell(r))
s <- stack(r, r*2, r)
您的方法
q25 <- raster(s)
for(i in 1:ncell(q25)){
q25[i] <- quantile(s[i], .5, na.rm=TRUE)
}
更好的方法(快10倍,见下文)
q1 <- calc(s, fun=function(x) quantile(x, .5, na.rm=TRUE))
但对于中位数,使用速度更快(〜37倍)
q2 <- calc(s, fun=function(x)median(x, na.rm=TRUE))
速度比较:
system.time(for(i in 1:ncell(q25)){ q25[i] <- quantile(s[i], .5, na.rm=TRUE) })
#user system elapsed
#69.24 13.90 83.71
system.time( q1 <- calc(s, fun=function(x)quantile(x, .5, na.rm=TRUE)))
#user system elapsed
#7.81 0.00 7.81
system.time(q2 <- calc(s, fun=function(x)median(x, na.rm=TRUE)))
#user system elapsed
#2.23 0.00 2.23
答案 1 :(得分:0)
您可以通过并行运行上面的calc函数来加快处理速度。此链接包含有关操作方法的一些信息。祝好运... https://www.gis-blog.com/increasing-the-speed-of-raster-processing-with-r-part-33-cluster/