我想对具有动态维数 k 的数组进行子集化。
举个例子:
A <- array(1:3^4, dim=c(3,3,3,3))
因为尺寸可能会有所不同(此处未显示),所以我不能简单地定义 a、b、c、d 并通过以下方式进行查询
a <- 1:2; b <- 2; c <- 2:3; d = 1
A[a, b, c, d]
Here已经表明,如果想要仅对单个元素进行子集化,可以像这样进行操作:
e <- 1; f <- 2; g <- 3; h <- 1
A[matrix(c(e, f, g, h), nrow = 1)]
这使我能够保持维数的灵活性,但我只能对单个元素进行子集化,因为我无法在矩阵中表示序列 a、b、c、d。
期望的情况是我可以获得输出
A[a, b, c, d]
无需对维度进行硬编码,即通过访问数组
A[object]
问题基本上是这是否可能,如果是,“对象”是什么样子。
任何帮助将不胜感激!
最佳答案
如果将 object
定义为列表,则可以使用 do.call
将该列表用作子集函数 [
的参数。如果将数组作为列表中的第一项,则可以直接调用 [
:
object <- list(A, a, b, c, d)
do.call(`[`, object)
## [,1] [,2]
## [1,] 13 22
## [2,] 14 23
如果你不想包含数组(如果你有很多这样的对象并且数组很大,它将需要大量内存),你可以编写一个匿名函数来只使用子集参数,不是子集:
object <- list(a, b, c, d)
do.call(function(...){A[...]}, object)
## [,1] [,2]
## [1,] 13 22
## [2,] 14 23
这实际上正是 abind::asub
所采用的方法:
object <- list(a, b, c, d)
abind::asub(A, object)
## [,1] [,2]
## [1,] 13 22
## [2,] 14 23
注意,这里的参数匹配是关系型的,所以如果为空,则需要包含NULL
:
object <- list(NULL, b, c, d)
abind::asub(A, object)
## [,1] [,2]
## [1,] 13 22
## [2,] 14 23
## [3,] 15 24
关于arrays - 具有动态维度的数组的子集部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42562823/