r - Terra R - 使用自定义函数加速栅格数据的聚合()
问题描述
我想使用包中的aggregate
函数terra
R
以分位数方法聚合栅格作为聚合函数。下面,我使用quantile
函数 fromR 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)
时差 6.052727 秒
当我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)
时间差 0.1456101 秒
由于我想计算第 50 位以外的其他百分位数,有人可以提供一些建议来加快aggregate
使用自定义函数的速度吗?
解决方案
aggregate()
使用自定义函数本身并不慢。quantile()
相反,使用而不是median()
获得中位数更昂贵。这可能是由于计算本身的成本(terra 使用C++ 实现来计算比任意分位数更快的中位数),并且还因为quantile()
执行更多检查并因此在过程中调用更多附加函数。当操作被多次执行时,这种更高的计算成本会增加aggregate
。
如果您有一个更大的栅格,则使用该cores
参数将计算分布在多个核心上可能是有益的,请参阅?terra::aggregate
. 但是,我认为这不是elev
数据的选择,因为开销太大。
如果你想调用aggregate
许多不同probs
的,你可以并行化循环,例如使用foreach包。
推荐阅读
- python - 如何使用 python 序列进行数组切片
- php - 在 WooCommerce 中的价格之前和之后添加文本,不包括订阅产品
- powershell - 如何查看端口后面正在运行的进程
- c# - 将 .NET 枚举转换为 GraphQL EnumerationGraphType
- asp.net - 如何使用队列系统等按钮逐个导航数据库
- entity-framework - 对象外部属性未填充
- haskell - 为什么`Concurrently`不是Haskell中的monad?
- python-3.x - KeyError:在 networkx 中使用 make_small_graph 功能时
- java - Java Servlets:Tomcat 服务器查找 MongoDB 类和包
- python - nltk.tree.Tree 对象如何生成树的字符串表示?