【问题标题】:Use apply on a multi-dimension array在多维数组上使用 apply
【发布时间】:2014-06-11 16:42:55
【问题描述】:

普通矩阵是二维矩阵。但是,我可以初始化:

a<-array(0,dim=c(2,3,4,5))

这是一个 2*4*5*3 的矩阵或数组。

命令

apply(a,c(2,3),sum)

将给出一个 4*5 数组,包含第 1 维和第 4 维元素的总和。

为什么会这样?据我所知,在apply函数中,1表示行,2表示列,但是这里的3是什么意思呢?

这里需要一些抽象。

【问题讨论】:

  • 1:n 是适用的维度,从行开始。

标签: arrays r matrix apply sapply


【解决方案1】:

了解数组上的apply 的最简单方法是尝试一些示例。这是从上一个示例对象in the documentation修改的一些数据:

> z <- array(1:24, dim = 2:4)
> dim(z)
[1] 2 3 4

> apply(z, 1, function(x) sum(x))
[1] 144 156
> apply(z, 2, function(x) sum(x))
[1]  84 100 116
> apply(z, 3, function(x) sum(x))
[1]  21  57  93 129

这里发生了什么?好吧,我们创建一个三维数组z。如果你使用applyMARGIN=1 你会得到行总和(两个值,因为有两行),如果你使用MARGIN=2 你会得到列总和(三个值,因为有三列),如果你使用@987654328 @ 你得到数组第三维的总和(四个值,因为数组的第三维有四个级别)。

如果你为MARGIN 指定一个向量,比如c(2,3),你会得到每一列和第三维级别的行总和。请注意,在上面的示例中,applyMARGIN=1 的结果是行和,MARGIN=2 分别是下面结果中矩阵的列和:

> apply(z, c(2,3), function(x) sum(x))
     [,1] [,2] [,3] [,4]
[1,]    3   15   27   39
[2,]    7   19   31   43
[3,]   11   23   35   47

如果您将所有维度指定为MARGIN=c(1,2,3),您只需获得原始的三维对象:

> all.equal(z, apply(z, c(1,2,3), function(x) sum(x)))
[1] TRUE

在这里学习的最好方法就是开始玩一些真实的矩阵。您的示例数据对于查看总和没有帮助,因为所有数组条目都为零。

【讨论】:

  • 我没有理解你所说的“如果你为 MARGIN 指定一个向量,比如 c(2,3),你会得到每一列和第三维级别的行总和。”
  • @GeekCat 与计算跨行或跨列的边际总和相反,它正在计算数组在这两个维度上的边际总和(好吧,c(2,3) 它实际上是列和数组的第三个尺寸,但希望你明白这一点)。我认为这很难用语言表达,所以看一些例子真的很有帮助。
猜你喜欢
  • 2021-02-16
  • 2011-08-13
  • 2011-08-04
  • 2013-09-30
  • 2014-12-25
  • 2010-10-17
  • 2013-05-22
  • 1970-01-01
相关资源
最近更新 更多