【问题标题】:Extend R 3D array vertically垂直扩展 R 3D 数组
【发布时间】:2019-05-05 06:54:04
【问题描述】:

我有一个大小为 c(1,n,m) 的数组。我想通过重复第一行 k 次来垂直扩展数组。所以我将有一个大小为 c(k,n,m) 的数组。例如:

x  <- array(1:6, c(1,3,2))

如果 k 为 3,我希望扩展数组为

, , 1

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


, , 2

      [,1] [,2] [,3]
[1,]    4    5    6
[2,]    4    5    6
[3,]    4    5    6

我目前在 for 循环中使用 aperm 执行此操作,但速度非常慢。因为我真正的问题的尺寸大约是 100*100*40000

提前致谢

【问题讨论】:

    标签: arrays r matrix multidimensional-array


    【解决方案1】:

    您可以在apply 中使用replicate 并在之后修复dim

    k <- 3
    out <- apply(x, 3, replicate, n = k)
    dim(out) <- dim(x)*c(k, 1, 1)
    aperm(out, c(2, 1, 3))
    
    # , , 1
    # 
    #      [,1] [,2] [,3]
    # [1,]    1    2    3
    # [2,]    1    2    3
    # [3,]    1    2    3
    # 
    # , , 2
    # 
    #      [,1] [,2] [,3]
    # [1,]    4    5    6
    # [2,]    4    5    6
    # [3,]    4    5    6
    

    或者(相同的结果)

    k <- 3
    out <- apply(x, 3, function(x) do.call(rbind, replicate(k, x, simp = F)))
    dim(out) <- dim(x)*c(k, 1, 1)
    out
    

    【讨论】:

    • 谢谢你,但每一页似乎都被转置了,这与我的预期输出略有不同
    • 我无法让第一个解决方案发挥作用 - 但第二个解决方案效果很好。谢谢。虽然它仍然存在性能问题。
    • 我发现以下方法更快,但不够简洁:out
    • 我更喜欢那个。您应该发布并接受它
    【解决方案2】:

    感谢 IceCreamToucan,

    我无法让第一个解决方案起作用 - 但第二个解决方案效果很好。谢谢。虽然它仍然存在性能问题

    我将您的原始解决方案修改如下。它更快,但不那么整洁:

    out <- t(matrix(rep(as.vector(x), k), nrow= dim(x)[2]*dim(x)[3], ncol= k)) 
    
    dim(out) <- c(k,1,1)*dim(x) 
    

    【讨论】:

      猜你喜欢
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 2011-05-30
      相关资源
      最近更新 更多