【问题标题】:Python: creating a covariance matrix from listsPython:从列表创建协方差矩阵
【发布时间】:2015-01-19 14:14:35
【问题描述】:

有没有最快的方法从以下三个列表转到 Python 中的协方差矩阵(numpy 数组)?

Fac2 Fac1  VarCovar
   a    a       1.4
   a    b       0.7
   a    c       0.3
   b    a       0.7
   b    b       1.8
   b    c       6.3
   c    a       0.3
   c    b       6.3
   c    c       2.4

【问题讨论】:

    标签: python pandas numpy matrix dataframe


    【解决方案1】:

    您可以使用 Pandas 轻松创建 3x3 矩阵。从上面的数组创建一个 DataFrame df 并使用 pivot_table 在第三列上旋转。

    例如,如果您有以下字典 d 的列表:

    {'Fac1': ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'],
     'Fac2': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'],
     'VarCovar': [1.4, 0.7, 0.3, 0.7, 1.8, 6.3, 0.3, 6.3, 2.4]}
    

    像这样创建 DataFrame:

    df = pd.DataFrame(d)
    

    然后:

    >>> df.pivot_table(rows='Fac1', cols='Fac2', values='VarCovar')
    Fac2    a    b    c
    Fac1               
    a     1.4  0.7  0.3
    b     0.7  1.8  6.3
    c     0.3  6.3  2.4
    

    使用末尾的values属性从表中返回一个NumPy数组:

    >>> df.pivot_table(rows='Fac1', cols='Fac2', values='VarCovar').values
    array([[ 1.4,  0.7,  0.3],
           [ 0.7,  1.8,  6.3],
           [ 0.3,  6.3,  2.4]])
    

    如果你没有所有的对,你可以以同样的方式继续,用转置的索引对填充缺失的值:

    >>> d = {'Fac1': ['a', 'b', 'c' , 'b', 'c', 'c'], 
             'Fac2': ['a', 'a', 'a' , 'b', 'b', 'c'], 
             'VarCovar': [1.4, 0.7, 0.3, 1.8, 6.3, 2.4]}
    >>> df = pd.DataFrame(d)
    >>> table = df.pivot_table(rows='Fac1', cols='Fac2', values='VarCovar')
    >>> table.combine_first(table.T)
    Fac2    a    b    c
    Fac1               
    a     1.4  0.7  0.3
    b     0.7  1.8  6.3
    c     0.3  6.3  2.4
    

    (我从 DSM 的回答 here 中接受了使用 combine_first 的想法)

    【讨论】:

    • 还有一个问题,当我查看数据时存在问题,我没有 a-b 和 b-a 对的协方差。相反,我只有一对值,您可以在下面看到示例: {'Fac1': ['a', 'b', 'c' , 'b', 'c', 'c'], 'Fac2': ['a', 'a', 'a' , 'b', 'b', 'c'], 'VarCovar': [1.4, 0.7, 0.3, 1.8, 6.3, 2.4]} 任何想法解析为协方差矩阵
    • 太棒了!!这真的很有帮助,你是明星!为我节省了大量时间
    猜你喜欢
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    相关资源
    最近更新 更多