Python:从列表创建协方差矩阵
Posted
技术标签:
【中文标题】Python:从列表创建协方差矩阵【英文标题】:Python: creating a covariance matrix from lists 【发布时间】: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
【问题讨论】:
【参考方案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] 任何想法解析为协方差矩阵 太棒了!!这真的很有帮助,你是明星!为我节省了大量时间以上是关于Python:从列表创建协方差矩阵的主要内容,如果未能解决你的问题,请参考以下文章