簡體   English   中英

R對於每個第三維,通過向量乘以3D陣列的第二維

[英]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]

如何將其清理為一個命令?

首先將Vect轉換為數組,然后將元素乘以:

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

Arr <- varr * Arr

(當然,如果你想在一個命令中使用它,我們不需要存儲varr

(另外,事實證明這基本上是sweep引擎蓋下的......)

嘗試:

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

plyr包中的aaply()函數正是您正在尋找的。 它可以在任何維度的數組上運行,並根據需要拆分它們。 在這種情況下,您按行拆分:

library(plyr)
Arr2 <- aaply(Arr, 1, function(x,y){x*y}, Vect)

我們也可以復制'Vect'並乘以'Arr'。 col是一個方便的函數,它提供列的數字索引。

res1 <- Arr * Vect[col(Arr[,,1])]

或者我們明確地做rep

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM