【问题标题】:Flexible array subsetting灵活的数组子集
【发布时间】:2014-04-27 13:10:55
【问题描述】:

我想编写一个函数,它将具有可变维数(例如,dim(X) => c(2,3)dim(X) => c(2,3,5))的数组 X 以及维索引列表和数字索引作为输入。该函数根据指定的维度和索引返回数组的子集。例如:

dim(B) => c(2,5,10)
FUN(B, list(list(2,1:3), list(3,6:10))) => B[, 1:3, 6:10]

挑战来自于没有预先指定 B 的尺寸。我能想出的最佳解决方案是生成一个字符串s <- "B[,1:3, 6:10]"(细节省略且不重要),然后发出一个 eval(parse(text=s))。我不认为这是一个优雅的解决方案,也可能不是一个有效的解决方案。我想知道是否有人可以提出一个简单的方法。

【问题讨论】:

  • 我不确定我是否理解。我认为您的意思是通过以下方式证明:如果我有array(1:27, c(3, 3, 3)),那么提供它和一个向量c(2,2,2) 应该给我相应的项目(在本例中为14),但是对于任意数量的维度?跨度>

标签: arrays r


【解决方案1】:

我是 similar to this earlier question。一般策略是为所有维度生成索引列表,其中非指定维度由单个TRUE 表示,然后允许您使用do.call 调用[

sub_arr <- function(X, lst) {
  dim.list <- as.list(rep(T, length(dim(X))))
  dim.list[vapply(lst, `[[`, 1, 1)] <- lapply(lst, `[[`, 2)
  do.call(`[`, c(list(X), dim.list))
}
B <- array(1:16, dim=rep(2, 4))
sub_arr(B, list(list(2, 1:2), list(3, 1)))

生产:

, , 1
     [,1] [,2]
[1,]    1    3
[2,]    2    4
, , 2
     [,1] [,2]
[1,]    9   11
[2,]   10   12    

还有:

identical(
  B[, 1:2, 1, ],
  sub_arr(B, list(list(2, 1:2), list(3, 1)))
)
# [1] TRUE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多