2
有沒有一種最快捷的方法從以下三個列表轉到Python中的協方差矩陣(numpy數組)?Python:從列表創建一個協方差矩陣
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中的協方差矩陣(numpy數組)?Python:從列表創建一個協方差矩陣
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
您可以使用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]}
創建這樣的數據幀:
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
(我把這個想法使用來自帝斯曼的combine_first
的回答here)
這就是輝煌!這就是我正在尋找的,thatnks ajcr! – Chaos 2014-11-21 13:25:43
很高興它是有用的! – 2014-11-21 13:27:17
還有一個問題,當我看到數據時有一個問題,我沒有a-b和b-a對的協方差。相反,我只有一對值,你可以看到示例belwo: {'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]} 任何想法如何將其解析爲協方差矩陣 – Chaos 2014-11-21 13:50:09