(我来自python,这就是为什么我的问题有一种蟒蛇风格)
我有一个矩阵x
(str(x)-> num[1:1000,1:4]
)和一个向量y
(str(y) -> num[1:4]
)。我想从x
中的y
每个列减去x_y[i] = x[,i]-y[i]
中的coreespoonding条目。即t(t(x)-y)
。
我发现这样做的方式是numpy
,但在我看来,这是一种相当神秘的方式。是否有更多读者友好的方法来做到这一点?
对于那些知道python的人:我实际上是在寻找np.newaxis
中已知的类似广播方式,它通过return
等来形成维度。
答案 0 :(得分:1)
还有其他选择。
我正在使用x
和y
这样创建:
x <- matrix(1:4000, ncol = 4)
y <- 1:4
第一个使用sweep()
,其中2
是MARGIN
:
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)
是最快的。