Python 对角化级数

Python 对角化级数,python,pandas,matrix-multiplication,Python,Pandas,Matrix Multiplication,我正在用Python中非常可爱的pandas库做一些矩阵代数。我非常喜欢使用Series和Dataframe对象,因为它能够命名行和列 但是,在维护行/列名的同时,是否有一种简洁的方法来对序列进行对角化 考虑以下最低限度的工作示例: >>> import pandas as pd >>> s = pd.Series(randn(5), index=['a', 'b', 'c', 'd', 'e']) >>> s a 0.137477 b

我正在用Python中非常可爱的
pandas
库做一些矩阵代数。我非常喜欢使用Series和Dataframe对象,因为它能够命名行和列

但是,在维护行/列名的同时,是否有一种简洁的方法来对序列进行对角化

考虑以下最低限度的工作示例:

>>> 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
或者甚至(哪一个更好呢!):

这将非常好,因为这样我可以进行矩阵运算,如:

>>> S.dot(s)
a    0.018900
c    0.368160
b    0.007230
e    0.326910
d    0.225724
dtype: float64
并保留名称

和往常一样,我要提前表示感谢。 罗伯这个怎么样

In [107]: pd.DataFrame(np.diag(s),index=s.index,columns=s.index)
Out[107]: 
          a         b         c         d         e
a  0.630529  0.000000  0.000000  0.000000  0.000000
b  0.000000  0.360884  0.000000  0.000000  0.000000
c  0.000000  0.000000  0.345719  0.000000  0.000000
d  0.000000  0.000000  0.000000  0.796625  0.000000
e  0.000000  0.000000  0.000000  0.000000 -0.176848

注意:我意识到最后一个示例
S.dot(S)
非常愚蠢,可以通过
S*S
实现,但它只是作为一个示例!更新(虽然在你原来的帖子里看起来你想要一个索引中的数字范围,但最多2个)哈哈!我想我比你快了几秒钟。非常感谢杰夫。很好的解决方案。
In [107]: pd.DataFrame(np.diag(s),index=s.index,columns=s.index)
Out[107]: 
          a         b         c         d         e
a  0.630529  0.000000  0.000000  0.000000  0.000000
b  0.000000  0.360884  0.000000  0.000000  0.000000
c  0.000000  0.000000  0.345719  0.000000  0.000000
d  0.000000  0.000000  0.000000  0.796625  0.000000
e  0.000000  0.000000  0.000000  0.000000 -0.176848