python 3.5.2;熊猫0.23.4; numpy 1.15.4;在Windows上
我正在尝试找到一种有效的方法来逐个矩阵地对熊猫进行乘法运算,例如:
np.random.seed(43)
w_ = np.random.uniform(size=(3,5))
# the vector w
w = pd.DataFrame(w_/w_.sum(axis=0), index=['a', 'b', 'c'])
# the matrix cov
cov = pd.DataFrame(np.cov(np.random.randn(3,100)), index=r.index, columns=r.index)
计算:对于w的每一列,我使用:
r = [w.iloc[:,i].T.dot(cov.dot(w.iloc[:, i])) for i in range(w.shape[1])]
给予:
[0.5073635209626383、0.3262776109704286、0.45469128089985883、0.5226072271864488、0.35602577932396257]
这很好,但是我正在寻找一种更有效,更优雅的方法,而不是通过列表理解或lambda函数。
答案 0 :(得分:1)
您可以使用np.diag:
In [11]: np.diag(w.T.dot(cov.dot(w)))
Out[11]: array([0.50736352, 0.32627761, 0.45469128, 0.52260723, 0.35602578])
In [12]: r
Out[12]:
[0.5073635209626383, 0.32627761097042857, 0.45469128089985883,
0.5226072271864487, 0.3560257793239626]