Python numpy或pandas相当于R函数sweep()

时间:2014-04-16 18:48:31

标签: python arrays r numpy pandas

R numpy等效的pandassweep()是什么?

详细说明:在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中听到过关于numpypandas的令人兴奋的事情,它似乎有很多R个命令。使用这些库实现相同目标的最快方法是什么?实际数据有数百万行和大约50列。 β矢量当然与数据一致。

3 个答案:

答案 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