2013-04-08 68 views
1

我想強制使用Python Pandas進行矩陣乘法「方向」,在DataFrame和DataFrame之間,Dataframe對系列和Series對系列。熊貓強制矩陣乘法

舉個例子,我嘗試下面的代碼:

t = pandas.Series([1, 2]) 
print(t.T.dot(t)) 

,輸出:5

但我相信這一點:

[1 2 
2 4] 

大熊貓是偉大的,但是這不能做矩陣乘法我想要的方式是最令人沮喪的,所以任何幫助將不勝感激。 PS:我知道熊貓試圖隱式使用索引來找到計算矩陣乘積的正確方法,但似乎這種行爲不能被關閉!

+4

一系列是一維物體;它的轉置是(真空 被定義爲)本身。即使在純粹的numpy中,'a = np.array([1,2]); a.dot(a.T)'將給出'5'。爲什麼不簡單地編寫一個函數 - 'silly_dot' - 使用'numpy'中使用的'a [:,None]'技巧,它會給出你想要的行爲? – DSM 2013-04-08 22:26:37

+0

我不知道有關numpy技巧,但即使它適用於Series,也不適用於DataFrame。當我需要時,我只希望Pandas像Octave一樣進行矩陣乘法運算:簡單的t'* t可以解決Octave中的問題。爲什麼不在熊貓? – gaborous 2013-04-08 22:38:38

+0

你應該看看這個頁面:http://www.scipy.org/NumPy_for_Matlab_Users#head-e9a492daa18afcd86e84e07cd2824a9b1b651935,爲什麼''''''意味着元素乘法而不是點乘積,但DSM指出,你可以創建一個函數來模擬你正在尋找的東西 – Jeff 2013-04-08 23:55:54

回答

0

解決方案由Y-P發現:

https://github.com/pydata/pandas/issues/3344#issuecomment-16533461

from pandas.util.testing import makeCustomDataframe as mkdf 
a=mkdf(3,5,data_gen_f=lambda r,c: randint(1,100)) 
b=mkdf(5,3,data_gen_f=lambda r,c: randint(1,100)) 
c=DataFrame(a.values.dot(b.values),index=a.index,columns=b.columns) 
print a 
print b 
print c 
assert (a.iloc[0,:].values*b.iloc[:,0].values.T).sum() == c.iloc[0,0] 

C0  C_l0_g0 C_l0_g1 C_l0_g2 C_l0_g3 C_l0_g4 
R0             
R_l0_g0  39  87  88  2  65 
R_l0_g1  59  14  76  10  65 
R_l0_g2  93  69  4  29  58 
C0  C_l0_g0 C_l0_g1 C_l0_g2 
R0         
R_l0_g0  76  88  11 
R_l0_g1  66  73  47 
R_l0_g2  78  69  15 
R_l0_g3  47  3  40 
R_l0_g4  54  31  31 
C0  C_l0_g0 C_l0_g1 C_l0_g2 
R0         
R_l0_g0 19174 17876  7933 
R_l0_g1 15316 13503  4862 
R_l0_g2 16429 15382  7284 

這裏的斷言是沒用的,它只是做了檢查,它的的確是一個正確的矩陣乘法。

這裏的關鍵似乎是4號線:

c=DataFrame(a.values.dot(b.values),index=a.index,columns=b.columns) 

這裏做的事情是,它計算的a和b的點積,但力所產生的數據幀C具有的索引和B柱,確實將點乘積轉換爲矩陣乘法,並且由於您保留了索引和列(您丟失了a的列和b的索引,但由於在矩陣乘法中對這些行進行求和,所以這在語義上是正確的)保持它們是沒有意義的)。

這有點尷尬,但看起來很簡單,如果它與API的其餘部分一致(我仍然需要測試系列x數據幀和系列x系列的結果,我會在這裏發表我的發現) 。

3

這裏:

In [1]: import pandas 

In [2]: t = pandas.Series([1, 2]) 

In [3]: np.outer(t, t) 
Out[3]: 
array([[1, 2], 
     [2, 4]]) 
+0

完美,它非常完美! Pandas應該將.outer()添加到Series和DataFrame中(即使這意味着在進程中丟失索引,這種操作通常也是需要的!)。 – gaborous 2013-04-09 12:33:09

+0

等待:它確實適用於我所示的示例,但它並不能完全解決整個問題:無論t的方向(可以是t還是轉置t),它總是輸出相同的結果!我希望能夠強制我想要的方向,而不僅僅是外部點的產品。 – gaborous 2013-04-09 12:36:45

+0

爲什麼不使用點vs外部而不是轉置?如果你真的需要被視爲一個二維矩陣,你應該做@DSM建議的事情,並且做t = t [:,None] – 2013-04-09 21:45:49