提问人:JoeBass 提问时间:12/30/2015 更新时间:12/30/2015 访问量:1570
R 将 3D 数组的第二维乘以每个 3 维的向量
R Multiply second dimension of 3D Array by a Vector for each of the 3rd dimension
问:
当尝试将数组的第一维乘以向量的每个索引乘以第二维时,我的数组被转换为矩阵,事情变得松散。我只能做正确的乘法。
真是满嘴......
用代码更容易解释......
Arr <- array(runif(10*5*3), dim = c(10,5,3))
dim(Arr)
Vect <- c(1:5)
Arr[,1,1] <- Arr[,1,1]*Vect[1]
Arr[,1,2] <- Arr[,1,2]*Vect[1]
Arr[,1,3] <- Arr[,1,3]*Vect[1]
Arr[,2,1] <- Arr[,2,1]*Vect[2]
Arr[,2,2] <- Arr[,2,2]*Vect[2]
Arr[,2,3] <- Arr[,2,3]*Vect[2]
Arr[,3,1] <- Arr[,3,1]*Vect[3]
Arr[,3,2] <- Arr[,3,2]*Vect[3]
Arr[,3,3] <- Arr[,3,3]*Vect[3]
Arr[,4,1] <- Arr[,4,1]*Vect[4]
Arr[,4,2] <- Arr[,4,2]*Vect[4]
Arr[,4,3] <- Arr[,4,3]*Vect[4]
Arr[,5,1] <- Arr[,5,1]*Vect[5]
Arr[,5,2] <- Arr[,5,2]*Vect[5]
Arr[,5,3] <- Arr[,5,3]*Vect[5]
如何将其清理为一个命令?
答:
5赞
MichaelChirico
12/30/2015
#1
首先转换为数组,然后进行元素乘法:Vect
varr <- aperm(array(Vect, dim = c(5L, 10L, 3L)), perm = c(2L, 1L, 3L))
Arr <- varr * Arr
(当然,如果您希望在一个命令中存储它,我们不需要存储)varr
(另外,事实证明,这基本上就是引擎盖下的作用......sweep
8赞
fishtank
12/30/2015
#2
尝试:
sweep(Arr,2,Vect,FUN="*")
评论
1赞
MichaelChirico
12/30/2015
手册页远未具有启发性(我仍然不知道“要清除的汇总统计数据”是什么意思),但您在这里已经很好地阐明了它的使用!将其指定给 SO Dox(如果真是这样的话......sweep
STATS
1赞
NGaffney
12/30/2015
#3
plyr 包中的函数完全可以满足您的需求。它可以对任何维度的数组进行操作,并根据需要拆分它们。在本例中,您将按行拆分,因此:aaply()
library(plyr)
Arr2 <- aaply(Arr, 1, function(x,y){x*y}, Vect)
1赞
akrun
12/30/2015
#4
我们还可以复制“Vect”并与“Arr”相乘。这是一个方便的函数,它提供了列的数字索引。col
res1 <- Arr * Vect[col(Arr[,,1])]
或者我们明确地执行rep
res2 <- Arr* rep(Vect, each=dim(Arr)[1])
identical(res1, res2)
#[1] TRUE
评论