【问题标题】:r array-slice of programmatically determined dimension [duplicate]r以编程方式确定的维度的数组切片[重复]
【发布时间】:2013-05-12 12:21:31
【问题描述】:

有没有一种方法可以优雅地在 R 中的多维数组中指定一个切片,从而事先不知道维数?

例如,对于一个 5 维数组,可以使用

来切出最后一维
fourdimslice <- fivedimarray[,,,,1]

但我想为任意维度编写代码,例如

slice <- arbitrarydimarray(dim=5, index=1)

我无法理解do.call('[', ...) 是否会成为一种方法。我也尝试过命名维度,但a[fifth=1] 并没有按照我想要的方式进行解释。

我想像apply() 这样的函数需要做类似的事情。

【问题讨论】:

  • 看看stackoverflow.com/questions/14500707/…是否回答了你的问题。
  • 我实际上曾经写过一些代码(在年轻和愚蠢的时候:-)),它查看了数组的维数并通过循环像 foo&lt;-'x[' ; for (i in 1:(n-1) ) foo &lt;- paste(foo,',') 这样的东西来构建一个字符串。 V. Zoonekynd 的回答确实很好。

标签: r multidimensional-array slice


【解决方案1】:

您可以使用来自abind 包的asub

# Sample data: a 5-dimensional array
x <- array(seq_len(prod(2:6)), dim=2:6)

library(abind)
str( asub(x, 1, 5) )
# int [1:2, 1:3, 1:4, 1:5] 1 2 3 4 5 6 7 8 9 10 ...
str( x[,,,,1] )
# int [1:2, 1:3, 1:4, 1:5] 1 2 3 4 5 6 7 8 9 10 ...
all( asub(x, 1, 5) == x[,,,,1] )
# [1] TRUE

【讨论】:

    【解决方案2】:

    这是提取第一片的奇怪解决方案

    your.array=array(runif(27),dim=c(3,3,3)) # this is to create an example of array from which you want a slice.
    
    array(your.array[1:prod(dim(your.array)[-1])],dim(your.array)[-1])
    

    【讨论】:

      【解决方案3】:

      如果你不想使用abind 包,看起来你可以使用基于slice.index 的双线。不知道哪个效率更高...

      x <- array(seq_len(prod(2:6)), dim=2:6)
      library(abind)
      str( y <- asub(x, 1, 5) )
      

      或者:

      z <- x[slice.index(x,5)==1]
      

      这会提取正确的元素,但尺寸会丢失。恢复它们:

      dim(z) <- dim(x)[-5]
      

      (您显然可以将其包装在适当的函数中。)测试:

      all.equal(y,z)  ## TRUE
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-29
        • 1970-01-01
        • 2012-02-01
        • 2012-02-20
        • 2021-03-19
        • 1970-01-01
        • 2010-09-16
        • 2019-05-09
        相关资源
        最近更新 更多