[英]Looking for a more efficient way to filter an array
我有兩個 arrays 我從krige()
獲得, values
和variances
有幾百萬個條目。 這兩個arrays長度相同,1:1匹配。 我想刪除方差超過特定閾值的值。 我真的不需要就地修改values
,生成第三個數組就可以了。
以下代碼工作正常:
for (i in 1:length(values)) {
if (variances[i] > 0.8) {
values[i] = NA
}
}
不幸的是,它非常慢並且只使用一個處理器內核。 我真的需要手動處理並行計算嗎? 這聽起來很通用,所以它應該以某種方式內置,不僅是通過使用多個內核,還可能是一些矢量處理器指令?
請賜教。
只要那些 arrays 匹配,你就應該能夠將一個與另一個子集化:
set.seed(1)
(values <- array(1:25, c(5,5)))
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] 1 6 11 16 21
#> [2,] 2 7 12 17 22
#> [3,] 3 8 13 18 23
#> [4,] 4 9 14 19 24
#> [5,] 5 10 15 20 25
(variances <- array(rnorm(25,.8,0.2),c(5,5)))
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] 0.6747092 0.6359063 1.1023562 0.7910133 0.9837955
#> [2,] 0.8367287 0.8974858 0.8779686 0.7967619 0.9564273
#> [3,] 0.6328743 0.9476649 0.6757519 0.9887672 0.8149130
#> [4,] 1.1190562 0.9151563 0.3570600 0.9642442 0.4021297
#> [5,] 0.8659016 0.7389223 1.0249862 0.9187803 0.9239651
is.na(values[variances > .8]) <- TRUE
values
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] 1 6 NA 16 NA
#> [2,] NA NA NA 17 NA
#> [3,] 3 NA 13 NA NA
#> [4,] NA NA 14 NA 24
#> [5,] NA 10 NA NA NA
對於 1000 萬的數組長度,在我的筆記本電腦上大約需要一秒鍾,包括數據生成:
system.time({
values <- array(1:10e6, c(1000,10000))
variances <- array(rnorm(10e6,.8,0.2),dim(values))
is.na(values[variances > .8]) <- TRUE
})
#> user system elapsed
#> 1.05 0.10 1.14
dim(variances)
#> [1] 1000 10000
object.size(variances)
#> 80000216 bytes
object.size(values)
#> 40000216 bytes
創建於 2023-01-18,使用reprex v2.0.2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.