0

假设我有一个大小为 (nx m_1 x m_2 x m_3) 的数组 Y。如果我想要第一个大小为 (m_1 x m_2 x m_3) 的子数组,我可以使用逗号选择它

Y(1,,,)

同样,如果 Y 的大小为 (nx m_1 x m_2 x m_3 x m_4) 并且我想要第一个大小为 (m_1 x m_2 x m_3 x m_4) 的子数组,我可以使用逗号将其选择为

Y(1,,,,)

一般来说,如果 Y 是一个大小为 (nx m_1 x m_2 x ... x m_p) 的数组,并且我想要第一个大小为 (m_1 x m_2 x ... x m_p) 的子数组,我可以将其选为

Y(1,,...,)

其中 ,,... 表示 p 个不同的逗号。如果 p 已知,我该如何写 p 逗号?

一个简单的解决方案是

array(array(Y,c(dim(Y)[1],prod(dim(Y)[-1])))[1,])

但是,这是低效的代码(Y 可能很大,我不希望将其转换为矩阵然后再将其转换回数组)

4

1 回答 1

1

您始终可以将表达式构建为文本并稍后对其进行评估。在您的情况下,您可以使用strrep(",", p)重复 "," p 次,然后使用str2expression()将其转换为可以评估的表达式。如果你把它放在一个函数中:

slice_first_dimension <- function(arr){
  p <- length(dim(Y))
  eval(str2expression(paste0("arr[1",strrep(",", p-1),"]")))
}

Y <- array(1:8, dim=c(2,2,2))
slice_first_dimension(Y)
#>      [,1] [,2]
#> [1,]    1    5
#> [2,]    3    7
于 2020-10-21T04:22:20.493 回答