使用 $p$ 逗号的子数组

Sub-array using $p$ commas

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

Y(1,,,)

类似地,如果 Y 的大小为 (n x 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 是一个大小为 (n x 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 可能很大,我不希望先将其转换为矩阵,然后再将其转换回数组)

您始终可以将表达式构建为文本,然后再对其求值。在您的情况下,您可以使用 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