![](/img/trans.png)
[英]Efficient python pandas equivalent/implementation of R sweep with multiple arguments
[英]Python numpy or pandas equivalent of the R function sweep()
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
參數“等效”,除了它采用值 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.