我正在使用Python中非常好用的pandas
库进行矩阵代数计算。我非常喜欢使用Series和Dataframe对象,因为它们能够给行和列命名。
但是有没有一种简便的方法来对角化一个Series并保留行/列名称呢?
考虑以下最小工作示例:
>>> import pandas as pd
>>> s = pd.Series(randn(5), index=['a', 'b', 'c', 'd', 'e'])
>>> s
a 0.137477
b -0.606762
c 0.085030
d -0.571760
e -0.475104
dtype: float64
现在,我可以做到:
>>> import numpy as np
>>> np.diag(s)
array([[ 0.13747693, 0. , 0. , 0. , 0. ],
[ 0. , -0.60676226, 0. , 0. , 0. ],
[ 0. , 0. , 0.08502993, 0. , 0. ],
[ 0. , 0. , 0. , -0.57176048, 0. ],
[ 0. , 0. , 0. , 0. , -0.47510435]])
但我希望找到一种方法,可以生成类似于以下形式的数据框:
a b c d e
0 0.137477 0.000000 0.00000 0.00000 0.000000
1 0.000000 -0.606762 0.00000 0.00000 0.000000
2 0.000000 0.000000 0.08503 0.00000 0.000000
3 0.000000 0.000000 0.00000 -0.57176 0.000000
4 0.000000 0.000000 0.00000 0.00000 -0.475104
或者甚至更好的是:
a b c d e
a 0.137477 0.000000 0.00000 0.00000 0.000000
b 0.000000 -0.606762 0.00000 0.00000 0.000000
c 0.000000 0.000000 0.08503 0.00000 0.000000
d 0.000000 0.000000 0.00000 -0.57176 0.000000
e 0.000000 0.000000 0.00000 0.00000 -0.475104
这将非常有用,因为我可以执行如下矩阵运算:
>>> S.dot(s)
a 0.018900
c 0.368160
b 0.007230
e 0.326910
d 0.225724
dtype: float64
并保留名称。
非常感谢,一如既往。 罗布
S.dot(s)
很愚蠢,可以用s * s
实现,但它只是作为一个例子! - LondonRob