gpt4 book ai didi

r - Terra R - 使用自定义函数加速栅格数据的聚合()

转载 作者:行者123 更新时间:2023-12-04 16:36:54 25 4
gpt4 key购买 nike

我想使用 aggregate terra 包中的 R 函数来聚合栅格,使用分位数方法作为聚合函数。下面,我使用 quantile 中的 R base 函数使用本地包目录中的栅格计算第 50 个百分位数(即中位数)。我选择了第 50 个百分位数与中位数进行比较,但我的目标确实是计算其他分位数...

library(terra)
# load elevation coming with the terra pakage
r <- rast( system.file("ex/elev.tif", package="terra") )

plot(r)

# number of iteration
n_it <- 20

# with a custom function
start_time <- Sys.time()
for (i in 1:n_it){
ra <- aggregate(r, 2 , fun = function(x) quantile(x, probs = .5, na.rm = T))
}
end_time <- Sys.time()
我的电脑花了大约。 6秒做20次。
print(end_time-start_time)

Time difference of 6.052727 secs


当我使用中值内置函数运行相同的 aggregate 时,大约需要。执行相同的 20 次迭代所需的时间减少了 40 倍!
# with a built-in function
start_time <- Sys.time()
for (i in 1:n_it){
ra <- aggregate(r, 2 , fun = median)
}
end_time <- Sys.time()
print(end_time-start_time)

Time difference of 0.1456101 secs


由于我想计算第 50 个百分位数以外的其他百分位数,有人可以提供一些建议以在使用自定义函数时加速 aggregate 吗?

最佳答案

使用自定义函数时,并不是 aggregate() 本身很慢。相反,使用 quantile() 而不是 median() 来获得中位数的成本更高。这大概是由于计算本身的成本(terra 使用比 C++ implementation to compute the median 更快的 arbitrary quantile ),还因为 quantile() 执行更多检查,因此在过程中调用更多附加函数。当 aggregate 多次执行操作时,这种更高的计算成本会增加。
如果您有一个更大的栅格,使用 cores 参数将计算分布在多个核心上可能是有益的,请参阅 ?terra::aggregate 。但是,我认为这不是 elev 数据的选项,因为开销太大。
如果你想为许多不同的 aggregate 调用 probs 你可以并行化循环,例如使用 foreach package

关于r - Terra R - 使用自定义函数加速栅格数据的聚合(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68864334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com