1

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

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

fourdimslice <- fivedimarray[,,,,1]

但我想为任意尺寸编码,比如

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

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

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

4

3 回答 3

5

您可以使用asub, 从abind包中。

# 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
于 2013-05-17T11:11:29.647 回答
2

如果您不想使用该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
于 2013-05-17T12:45:23.587 回答
0

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

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])
于 2013-05-17T11:11:42.857 回答