【问题标题】:How to rollapply array along 3rd dimension?如何沿第三维滚动应用数组?
【发布时间】:2015-03-03 22:09:41
【问题描述】:

说我有数组:

> arr <- array(1, dim=c(3, 3, 3))
, , 1

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1

, , 2

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1

, , 3

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1

我想使用大小为 2 的滚动窗口计算移动平均值。这意味着我想计算数组的每个 3 维的移动平均值,将它们 2 乘以 2。最后,我会得到一些东西喜欢:

> rollmeanThatWorksWithArrays(arr, k=2, margin=c(1, 2))
, , 1

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1

, , 2

     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1

我可以使用apply(arr, margin=c(1, 2), mean) 在第三维上做这个平均值,但还没有弄清楚如何做一个滚动平均值。也许rollmean/rollapply根本不支持,我得自己写函数?

【问题讨论】:

  • 虽然示例数据很受欢迎,但滚动平均值的恒定值示例是毫无意义的。
  • @thelatemail 是的,我知道。我试图保持尽可能简单,尽管这可能会使它有点混乱。忍受我,想象一下数组中充满了随机数据:)

标签: r zoo


【解决方案1】:

您可以手动执行以下操作(使用与您不同的数组):

library(zoo)
arr <- array(1:27, dim=c(3, 3, 3))
res <- do.call(rbind ,tapply(c(arr), rep(1:9, 3), function(x) rollmean(x, k = 2)))
array(c(res), dim = c(3, 3, 2))
, , 1

     [,1] [,2] [,3]
[1,]  5.5  8.5 11.5
[2,]  6.5  9.5 12.5
[3,]  7.5 10.5 13.5

, , 2

     [,1] [,2] [,3]
[1,] 14.5 17.5 20.5
[2,] 15.5 18.5 21.5
[3,] 16.5 19.5 22.5

【讨论】:

  • 酷,谢谢!我会把这个问题留几天,看看是否有人想出更好的解决方案,但你的看起来不错。我知道这与原始问题无关,但是否可以(轻松)并行化?我正在使用 644x644x432 阵列,使用单核运行它需要一段时间。
  • 我会将第二行改为do.call(rbind ,tapply(c(arr), rep(1:644, 432), function(x) rollmean(x, k = 2))),最后一行改为array(c(res), dim = c(644, 644, 432-1))
【解决方案2】:

假设输入arr 与@RStudent 的答案相同。首先创建一个数组索引的data.frame ix,它定义了arr 的子集,取平均值。定义 Mean 以获取数组列表的平均值。最后,对于每个ixk 形成arr[,,k] 并将其转换为适合作为Mean 输入的列表。取Mean 并将结果简化为一个数组。

library(zoo)

w <- 2 # width

arr <- array(1:27, c(3, 3, 3))
n <- dim(arr)[3]

ix <- as.data.frame(t(rollapply(1:n, w, c)))
Mean <- function(L) Reduce("+", L) / length(L)
simplify2array(lapply(ix, function(ix) Mean(lapply(ix, function(k) arr[,,k]))))

给予:

, , V1

     [,1] [,2] [,3]
[1,]  5.5  8.5 11.5
[2,]  6.5  9.5 12.5
[3,]  7.5 10.5 13.5

, , V2

     [,1] [,2] [,3]
[1,] 14.5 17.5 20.5
[2,] 15.5 18.5 21.5
[3,] 16.5 19.5 22.5

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    相关资源
    最近更新 更多