解決方案由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系列的結果,我會在這裏發表我的發現) 。
一系列是一維物體;它的轉置是(真空 被定義爲)本身。即使在純粹的numpy中,'a = np.array([1,2]); a.dot(a.T)'將給出'5'。爲什麼不簡單地編寫一個函數 - 'silly_dot' - 使用'numpy'中使用的'a [:,None]'技巧,它會給出你想要的行爲? – DSM 2013-04-08 22:26:37
我不知道有關numpy技巧,但即使它適用於Series,也不適用於DataFrame。當我需要時,我只希望Pandas像Octave一樣進行矩陣乘法運算:簡單的t'* t可以解決Octave中的問題。爲什麼不在熊貓? – gaborous 2013-04-08 22:38:38
你應該看看這個頁面:http://www.scipy.org/NumPy_for_Matlab_Users#head-e9a492daa18afcd86e84e07cd2824a9b1b651935,爲什麼''''''意味着元素乘法而不是點乘積,但DSM指出,你可以創建一個函數來模擬你正在尋找的東西 – Jeff 2013-04-08 23:55:54