假设我有一个矩阵(df):
c1 c2 c3
c1 21.7 23.4 17.3
c2 23.4 25.8 17.0
c3 17.4 17.0 23.1
我想用这个公式规范化这个矩阵:
生成这个新的规范化矩阵:
c1 c2 c3
c1 1.0 0.97 0.63
c2 0.97 1.0 0.53
c3 0.63 0.53 1.0
where C'(1,2) = 23.4/(21.7+25.8-23.4)
= 0.97
我尝试过使用df.corrcoef
,但结果并不是我所期望的。
答案 0 :(得分:2)
您可以在数组的broadcasting of numpy arrays上使用diagonal:
>>> arr = df.values
>>> arr
array([[ 21.7, 23.4, 17.3],
[ 23.4, 25.8, 17. ],
[ 17.4, 17. , 23.1]])
>>> arr / (np.diag(arr) + np.diag(arr)[:,np.newaxis] - arr)
array([[ 1. , 0.971 , 0.6291],
[ 0.971 , 1. , 0.5329],
[ 0.635 , 0.5329, 1. ]])
对于每对坐标np.diag(arr) + np.diag(arr)[:,np.newaxis]
, c(u,u) + c(v,v)
相当于等式中的(u, v)
:
>>> np.diag(arr) + np.diag(arr)[:,np.newaxis]
array([[ 43.4, 47.5, 44.8],
[ 47.5, 51.6, 48.9],
[ 44.8, 48.9, 46.2]])