使用MultiIndex的成对矩阵乘法

时间:2015-12-13 19:44:11

标签: python pandas matrix

我有两个MultiIndexed数据帧,每个数据帧代表一组k dxd矩阵。我想计算每对k对的成对矩阵乘积。

有人知道在一次操作中是否可以这样做吗?

以下是样本数据帧(请注意,值将不同,即每个矩阵中的值不同)

    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

我想知道如何正确撰写最后一次操作。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

不确定这是OP的想法,但经常(就像我的情况一样),人们只关注k产品(Lambda.ix[k].dot(Sigma.ix[k]对所有k)和不是k^2个(Lambda.ix[i].dot(Sigma.ix[j]的所有组合i, j

对于那些对前者感兴趣的人,这里有一个使用groupbyconcat(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