将函数应用于3d数组的每个图层,返回一个数组

Mar*_*mpe 10 r

想象一下,你有一个包含行,列和层的三维数组:

A <- array (1:27, c(3,3,3))
Run Code Online (Sandbox Code Playgroud)

并且假设你有一个函数将矩阵作为输入并返回矩阵作为输出,如t.

如何将该函数应用于数组的每一层,返回与第一层相同大小的另一个数组?

我觉得我应该能够以apply某种方式做到这一点,但我做不到.

奖金问题(如果你回答这个问题,我将非常感激):这样做是否更快,或者为每个层矩阵和lapply函数制作一个列表?

-

编辑:请不要认为这个问题得到了回答 - 下面的答案没有回答这个问题.

mne*_*nel 5

您必须考虑要提取值的边距.

您可以3rd通过应用尺寸1和2(行和列,以获得更好的单词)来转置每个尺寸矩阵

apply(A,1:2,t)
, , 1

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]   10   11   12
[3,]   19   20   21

, , 2

     [,1] [,2] [,3]
[1,]    4    5    6
[2,]   13   14   15
[3,]   22   23   24

, , 3

     [,1] [,2] [,3]
[1,]    7    8    9
[2,]   16   17   18
[3,]   25   26   27
Run Code Online (Sandbox Code Playgroud)

您也可以使用plyr,aaply并且可以更直观地采取行动

library(plyr)

aaply(A,3,t)
, ,  = 1


X1   1  2  3
  1  1  4  7
  2 10 13 16
  3 19 22 25

, ,  = 2


X1   1  2  3
  1  2  5  8
  2 11 14 17
  3 20 23 26

, ,  = 3


X1   1  2  3
  1  3  6  9
  2 12 15 18
  3 21 24 27
Run Code Online (Sandbox Code Playgroud)

至于哪个更快lapply或者apply,我认为也许lapply会赢,但你仍然需要考虑你想从哪个边缘提取矩阵.

我通常发现在一个维度上思考要容易得多.如果地球平坦,一切都会更直接!

  • 怎么样'申请(A,c(1,3),t)`? (2认同)