将3D数组的第二维乘以向量,对于每个第三维。

5

当我试图将数组的第一维乘以向量的每个索引值的第二维时,我的数组会被转换为矩阵,事情变得混乱起来。我只能手动进行正确的乘法计算。

这话说得有点啰嗦...

通过代码更容易理解...

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]

我该如何将这个命令整理成一个命令?
4个回答

8

尝试:

sweep(Arr,2,Vect,FUN="*")

1
sweep 的手册页远非清晰易懂(我仍然不知道 STATS 意味着要“扫除”的摘要统计信息是什么),但您在这里精彩地阐述了它的用法!如果有可能,将其标记为 SO Dox(如果有的话...)。 - MichaelChirico

5

首先将 Vect 转换为数组,然后进行元素乘法:

varr <- aperm(array(Vect, dim = c(5L, 10L, 3L)), perm = c(2L, 1L, 3L))

Arr <- varr * Arr

当然,如果您希望在一个命令中完成此操作,则无需存储varr

另外,事实证明这基本上就是sweep在幕后所做的...


1
plyr包中的aaply()函数恰好可以实现您所需的功能。它可以操作任意维度的数组,并以您喜欢的方式拆分它们。在这种情况下,您正在按行拆分:
library(plyr)
Arr2 <- aaply(Arr, 1, function(x,y){x*y}, Vect)

1
我们也可以复制“Vect”并与“Arr”相乘。 “col”是一个方便的函数,它给出列的数字索引。
res1 <- Arr * Vect[col(Arr[,,1])]

或者我们明确地执行rep

res2 <- Arr* rep(Vect, each=dim(Arr)[1])
identical(res1, res2)
#[1] TRUE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接