Arrays 柔性阵列子集划分
我想编写一个函数,将具有可变维数的数组X作为输入(例如,Arrays 柔性阵列子集划分,arrays,r,Arrays,R,我想编写一个函数,将具有可变维数的数组X作为输入(例如,dim(X)=>c(2,3),或dim(X)=>c(2,3,5)),以及维数索引列表和数字索引。函数根据指定的维度和索引返回数组的子集。例如: dim(B) => c(2,5,10) FUN(B, list(list(2,1:3), list(3,6:10))) => B[, 1:3, 6:10] 挑战来自于这样一个事实,即B的尺寸没有事先指定。我能想到的最佳解决方案是生成一个字符串s,这是。一般策略是为所有维度生成索引列表,
dim(X)=>c(2,3)
,或dim(X)=>c(2,3,5)
),以及维数索引列表和数字索引。函数根据指定的维度和索引返回数组的子集。例如:
dim(B) => c(2,5,10)
FUN(B, list(list(2,1:3), list(3,6:10))) => B[, 1:3, 6:10]
挑战来自于这样一个事实,即B的尺寸没有事先指定。我能想到的最佳解决方案是生成一个字符串s,这是。一般策略是为所有维度生成索引列表,其中非指定维度由单个TRUE
表示,然后允许您使用do调用[
。调用:
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:27,c(3,3,3))
,那么提供它和向量c(2,2,2)
应该给我相应的项(在本例中为14),但对于任意数量的维度?
, , 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