【问题标题】:Looking for a more efficient way to filter an array寻找一种更有效的方法来过滤数组
【发布时间】:2023-01-19 00:26:18
【问题描述】:

我有两个从krige()valuesvariances 获得的数组,其中包含几百万个条目。这两个数组长度相同,并且彼此 ​​1:1 匹配。我想删除方差超过特定阈值的值。我真的不需要就地修改values,生成第三个数组就可以了。

以下代码工作正常:

    for (i in 1:length(values)) {
      if (variances[i] > 0.8) {
        values[i] = NA
      }
    }

不幸的是,它非常慢并且只使用一个处理器内核。我真的需要手动处理并行计算吗?这听起来很通用,所以它应该以某种方式内置,不仅是通过使用多个内核,还可能是一些矢量处理器指令?

请赐教。

【问题讨论】:

  • See here 制作一个可重现的例子,让人们更容易提供帮助。在无法访问您的任何数据、对其结构一无所知或不知道krige来自何处的情况下,除了猜测之外很难做任何其他事情

标签: r


【解决方案1】:

只要这些数组匹配,您就应该能够将一个与另一个进行子集化:

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

【讨论】:

    猜你喜欢
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多