R

时间:2017-10-20 07:04:20

标签: arrays r numpy

(我来自python,这就是为什么我的问题有一种蟒蛇风格)

我有一个矩阵xstr(x)-> num[1:1000,1:4])和一个向量ystr(y) -> num[1:4])。我想从x中的y每个列减去x_y[i] = x[,i]-y[i]中的coreespoonding条目。即t(t(x)-y)

我发现这样做的方式是numpy,但在我看来,这是一种相当神秘的方式。是否有更多读者友好的方法来做到这一点?

对于那些知道python的人:我实际上是在寻找np.newaxis中已知的类似广播方式,它通过return等来形成维度。

1 个答案:

答案 0 :(得分: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)是最快的。