R numpy
等效的pandas
或sweep()
是什么?
详细说明:在R中假设我们有一个系数向量(比如beta - 数字类型)和一个数组(比如数据 - 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列。 β矢量当然与数据一致。
答案 0 :(得分:6)
熊猫也有一种应用方法,适用于R&#39的扫描在引擎盖下使用。 (注意,MARGIN参数是&#34;等同于&#34;到许多pandas函数中的axis参数,除了它takes values 0 and 1 rather than 1 and 2)。
In [11]: np.random.seed = 1
In [12]: beta = pd.Series(np.random.randn(5))
In [13]: data = pd.DataFrame(np.random.randn(20, 5))
您可以对每行调用一个函数使用apply:
In [14]: 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而不是应用
答案 1 :(得分:3)
在numpy中,这个概念被称为&#34;广播&#34;。例如:
import numpy as np
x = np.random.random((4, 3))
x * np.array(range(4))[:, np.newaxis] # sweep along the rows
x + np.array(range(3))[np.newaxis, :] # sweep along the columns
答案 2 :(得分:-1)
这会更快吗?
t(t(data) * beta)
此处还有其他一些很好的答案,其中包含了Multiply rows of matrix by vector?
最后回答你关于numpy的问题。使用此参考(搜索矩阵乘法) http://mathesaurus.sourceforge.net/r-numpy.html