簡體   English   中英

Python numpy 或 Pandas 等效於 R 函數掃描()

[英]Python numpy or pandas equivalent of the R function sweep()

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參數“等效”,除了它采用值 0 和 1 而不是 1 和 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 )中做同樣的data.values ,或者直接相乘,這樣會更快,因為它不擔心數據對齊,或者使用矢量化而不是應用。

在 numpy 中,這個概念被稱為“廣播”。 例子:

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

這工作得更快嗎?

t(t(data) * beta)

這里有一些其他很好的答案,通過分析將矩陣的行乘以向量?

最后回答您關於 numpy 的查詢。 使用此參考(搜索矩陣乘法) http://mathesaurus.sourceforge.net/r-numpy.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM