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

标签 python arrays r numpy pandas

R 函数 sweep()numpypandas 等价物是什么?

详细说明:在 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 中的 numpypandas 的令人兴奋的事情,它似乎有很多类似 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/

相关文章:

r - 合并重复行并在 R 中添加列

python - 谷歌云存储python客户端AttributeError : 'ClientOptions' object has no attribute 'scopes' occurs after deployment

python - 如何使用电机干净地关闭更改流?

python - 我画出图像中最大的轮廓。但是用颜色填充是行不通的。任何的想法??

c - 字符串作为c中的参数

python - 列表和元组的行为不同

r - 包含 NA 的数据的聚集标准错误

python - 用于 Python 自动完成的 Emacs 扩展

Java vector : how to quickly "symmetrify" a large chunk of a huge sparse matrix

R:基于另一个变量的因子水平的新变量值