Python 带多索引的成对矩阵乘法

Python 带多索引的成对矩阵乘法,python,pandas,matrix,Python,Pandas,Matrix,我有两个多索引数据帧,每个都代表一组k dxd矩阵。我想计算每个k对的成对矩阵积 有人知道这在一次操作中是否可行吗 以下是示例数据帧(请注意,值将不同,即每个矩阵中的值不同) 我想知道如何正确地组合最后一个操作。不确定OP是否想到了这一点,但通常(就像我的例子一样),人们只对k产品(Lambda.ix[k].dot(Sigma.ix[k]所有k)感兴趣,而不是k^2产品(Lambda.ix[I].dot(Sigma.ix[j]适用于i、j的所有组合 >>> Lambda.dot

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

有人知道这在一次操作中是否可行吗

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


我想知道如何正确地组合最后一个操作。

不确定OP是否想到了这一点,但通常(就像我的例子一样),人们只对
k
产品(
Lambda.ix[k].dot(Sigma.ix[k]
所有
k
)感兴趣,而不是
k^2
产品(
Lambda.ix[I].dot(Sigma.ix[j]
适用于
i、j的所有组合

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

不确定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

这是一个完整的k^2$个矩阵结果,即λ0 xσ0,λ0 xσ1,等等。有没有一种方法(不需要迭代)只得到“对角”积,即λk xσk?这是一个完整的k^2$个矩阵结果,即λ0 xσ0,λ0 xσ1,等等。有没有一种方法(不需要迭代)只得到“对角线”产品,即lambda_k x sigma_k?