Lon*_*Rob 5 python matrix-multiplication pandas
我正在使用pandasPython 中非常可爱的库做一些矩阵代数。我真的很喜欢使用 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
Run Code Online (Sandbox Code Playgroud)
现在,我可以这样做:
>>> 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]])
Run Code Online (Sandbox Code Playgroud)
但我很想找到一种生成数据框的方法,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
或者甚至(这会更好!):
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
Run Code Online (Sandbox Code Playgroud)
这会很棒,因为这样我就可以进行矩阵运算,例如:
>>> S.dot(s)
a 0.018900
c 0.368160
b 0.007230
e 0.326910
d 0.225724
dtype: float64
Run Code Online (Sandbox Code Playgroud)
并保留名称。
一如既往,非常感谢。抢
这个怎么样..
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
Run Code Online (Sandbox Code Playgroud)