2015-12-13 2 views
1

У меня есть два мультииндексных кадра данных, каждый из которых представляет собой набор из k dxd-матриц. Я хотел бы вычислить попарно матричные произведения для каждой из k пар.Умножение парных матриц с помощью MultiIndex

Кто-нибудь знает, возможно ли это за одну операцию?

Здесь приведены примеры dataframes (обратите внимание, что значения будут отличаться, то есть не то же самое в каждой матрице)

ipdb> Lambda 
       0   1 
    0 0 1.274109 -0.753549 
     1 -0.753549 1.230817 
    1 0 1.274109 -0.753549 
     1 -0.753549 1.230817 
    2 0 1.274109 -0.753549 
     1 -0.753549 1.230817 
    3 0 1.274109 -0.753549 
     1 -0.753549 1.230817 

    ipdb> Sigma 
      0 1 
    0 0 10 0 
     1 0 10 
    1 0 10 0 
     1 0 10 
    2 0 10 0 
     1 0 10 
    3 0 10 0 
     1 0 10 

    ipdb> Lambda.ix[0].dot(Sigma.ix[0]) 
       0   1 
    0 12.741094 -7.535495 
    1 -7.535495 12.308169 

    ipdb> Lambda.dot(Sigma) 
    *** ValueError: matrices are not aligned 

Я задаюсь вопросом, как правильно составить последнюю операцию.

ответ

0
>>> Lambda.dot(Sigma.T) 
      0     1     2     3   
      0   1   0   1   0   1   0   1 
0 0 12.74109 -7.53549 12.74109 -7.53549 12.74109 -7.53549 12.74109 -7.53549 
    1 -7.53549 12.30817 -7.53549 12.30817 -7.53549 12.30817 -7.53549 12.30817 
1 0 12.74109 -7.53549 12.74109 -7.53549 12.74109 -7.53549 12.74109 -7.53549 
    1 -7.53549 12.30817 -7.53549 12.30817 -7.53549 12.30817 -7.53549 12.30817 
2 0 12.74109 -7.53549 12.74109 -7.53549 12.74109 -7.53549 12.74109 -7.53549 
    1 -7.53549 12.30817 -7.53549 12.30817 -7.53549 12.30817 -7.53549 12.30817 
3 0 12.74109 -7.53549 12.74109 -7.53549 12.74109 -7.53549 12.74109 -7.53549 
    1 -7.53549 12.30817 -7.53549 12.30817 -7.53549 12.30817 -7.53549 12.30817 
+0

это целые $ к^2 $ числа результатов матрицы, т.е. lambda_0 х sigma_0, lambda_0 х sigma_1 и т.д. Есть ли способ (за исключением итерации), чтобы получить только «диагональные» продукты, т. е. lambda_k x sigma_k? –

0

Не уверен, что это то, что было ОП в виду, но часто (как в моем случае), один заинтересован в как раз k продукции (Lambda.ix[k].dot(Sigma.ix[k] для всех k), а не k^2 из них (Lambda.ix[i].dot(Sigma.ix[j] для всех комбинации i, j).

Для тех, кто интересуется первым, приведена версия с использованием groupby и concat (meh). Было бы здорово иметь прямой метод, но там вы идете:

def drop_col_level(df, **kwds): 
    df.columns = df.columns.droplevel(**kwds) 
    return df 

pd.concat([l.dot(drop_col_level(s.T, level=0)) 
      for (_, l), (_, s) in zip(Lambda.groupby(level=0), Sigma.groupby(level=0))]) 

Out[151]: 
1   0   1 
0 1      
0 0 12.74109 -7.53549 
    1 -7.53549 12.30817 
1 0 12.74109 -7.53549 
    1 -7.53549 12.30817 
2 0 12.74109 -7.53549 
    1 -7.53549 12.30817 
3 0 12.74109 -7.53549 
    1 -7.53549 12.30817 
Смежные вопросы