Решение найдено 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, но заставляет результирующий DataFrame c иметь индексы a и столбцы b, действительно преобразовывая точечный продукт в матричное умножение, и в стиле pandas, поскольку вы сохраняете индексы и столбцы (вы теряете столбцы a и индексы b, но это семантически правильно, поскольку при умножении матриц вы суммируете эти строки, поэтому было бы бессмысленно их сохранять).
Это немного неудобно, но кажется достаточно простым, если согласуется с остальной частью API (мне все еще нужно проверить, какой будет результат с Series x Dataframe и Series x Series, я опубликую здесь свои выводы).
person
gaborous
schedule
20.04.2013
a = np.array([1,2]); a.dot(a.T)
даст5
. Почему бы просто не написать функцию --silly_dot
-- с использованием тех жеa[:,None]
приемов, которые вы использовали вnumpy
, чтобы получить желаемое поведение? - person DSM   schedule 09.04.2013*
означает поэлементное умножение, а не скалярное произведение, но, как указывает DSM, вы можете создать функцию для эмуляции того, что вы ищете - person Jeff   schedule 09.04.2013