我有两个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
我想知道如何正确撰写最后一次操作。
答案 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
。
对于那些对前者感兴趣的人,这里有一个使用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