您可以使用 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 的想法)