R 函数 sweep()
的 numpy
或 pandas
等价物是什么?
详细说明:在 R 中,假设我们有一个系数向量,例如 beta
(数字类型)和一个数组,例如 data
(20x5 数字类型)。我想在数组的每一行上叠加向量并乘以相应的元素。然后返回结果 (20x5) 数组,我可以使用 sweep()
实现此目的。
等效示例 R
代码:
beta <- c(10, 20, 30, 40)
data <- array(1:20,c(5,4))
sweep(data,MARGIN=2,beta,`*`)
#---------------
> data
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> beta
[1] 10 20 30 40
> sweep(data,MARGIN=2,beta,`*`)
[,1] [,2] [,3] [,4]
[1,] 10 120 330 640
[2,] 20 140 360 680
[3,] 30 160 390 720
[4,] 40 180 420 760
[5,] 50 200 450 800
我听说过有关 Python 中的 numpy
和 pandas
的令人兴奋的事情,它似乎有很多类似 R
的命令。使用这些库实现相同目标的最快方法是什么?实际数据有数百万行和大约 50 列。 beta
向量当然与数据一致。
最佳答案
Pandas 也有一个 apply()
方法,apply 是 R 的 sweep()
在引擎盖下使用。 (请注意,MARGIN 参数与许多 pandas 函数中的 axis
参数“等效”,除了它是 takes values 0 and 1 rather than 1 and 2 )。
np.random.seed = 1
beta = pd.Series(np.random.randn(5))
data = pd.DataFrame(np.random.randn(20, 5))
您可以将 apply 与在每一行上调用的函数一起使用:
data.apply(lambda row: row * beta, axis=1)
注意:axis=0
将应用于每一列,这是默认设置,因为数据是按列存储的,因此按列操作效率更高。
但是,在这种情况下,很容易显着加快(并且更易读)矢量化,只需按行相乘即可:
In [21]: data.apply(lambda row: row * beta, axis=1).head()
Out[21]:
0 1 2 3 4
0 -0.024827 -1.465294 -0.416155 -0.369182 -0.649587
1 0.026433 0.355915 -0.672302 0.225446 -0.520374
2 0.042254 -1.223200 -0.545957 0.103864 -0.372855
3 0.086367 0.218539 -1.033671 0.218388 -0.598549
4 0.203071 -3.402876 0.192504 -0.147548 -0.726001
In [22]: data.mul(beta, axis=1).head() # just show first few rows with head
Out[22]:
0 1 2 3 4
0 -0.024827 -1.465294 -0.416155 -0.369182 -0.649587
1 0.026433 0.355915 -0.672302 0.225446 -0.520374
2 0.042254 -1.223200 -0.545957 0.103864 -0.372855
3 0.086367 0.218539 -1.033671 0.218388 -0.598549
4 0.203071 -3.402876 0.192504 -0.147548 -0.726001
注意:这比使用 *
稍微更健壮/允许更多控制。
您可以在 numpy 中执行相同的操作(即 data.values
此处),直接相乘,这样会更快,因为它不担心数据对齐,或者使用 vectorize而不是申请。
关于相当于 R 函数 sweep() 的 Python numpy 或 pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23117756/