arrays - 具有动态维度的数组的子集部分

标签 arrays r

我想对具有动态维数 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/

相关文章:

c++ - 从 MATLAB 到 C++ 的多维数组

r - Sys.Date() 忽略系统时区

r - 如何将多行Excel单元格读入R

regex - 保护特定单词,从字符串中删除字母

sql - 在数据库中存储一对多关系 - 数组或一对多关系?

python - 带有 numpy 数组的 numpy 日志

C++ 动态数组一维非动态

javascript - 如何将数组推送更改为特定数组?

r - 在 R 中绘制带有多个参数的函数

r - R 中的 Azure 成本管理数据