2017-10-20 43 views
0

(我來自蟒蛇,這就是爲什麼我的問題有怎樣的pythonian風格)廣播中的R

我有一個矩陣xstr(x)-> num[1:1000,1:4])和矢量ystr(y) -> num[1:4])。我想從x的每列減去y中的核心指標條目。即x_y[i] = x[,i]-y[i]

我發現這樣做的方式是t(t(x)-y),但在我看來這是一個相當神祕的方式。有沒有更多的讀者友好的方式來做到這一點?

對於那些你們誰硝酸鉀蟒蛇:我基本上是尋找廣播的類似的方式,在numpy知道,那alloes通過np.newaxis

+3

看看'sweep()' – jogo

回答

1

外形尺寸還有其他的選擇也是如此。

我使用xy這樣創建:

x <- matrix(1:4000, ncol = 4) 

y <- 1:4 

第一種是使用sweep(),其中2MARGIN

sweep(x, 2, y) 

另一種方式是通過使用apply()循環排x

apply(x, 2, function(xi, y) { 

    xi - y 

}, y = y) 

如果你看看時間來評估你的選擇加上面兩個,你可以看到你的速度是最快的。

microbenchmark::microbenchmark(
    t(t(x)-y), 
    apply(x, 2, function(xi, y) { 

    xi - y 

    }, y = y), 
    sweep(x, 2, y), 
    times = 1000 
) 

輸出:

Unit: microseconds 
               expr min  lq  mean median  uq  max neval 
             t(t(x) - y) 23.062 24.3390 32.30354 25.6270 27.2205 1044.485 1000 
apply(x, 2, function(xi, y) {  xi - y }, y = y) 67.541 70.6580 96.80288 75.1020 79.7865 1245.883 1000 
            sweep(x, 2, y) 46.673 50.1955 108.42835 53.0515 57.0315 44158.248 1000 

從此你很可能推導出sweep()是性能和可讀性之間的良好折衷,但t(t(x) - y)是最快的。