2014-11-21 21 views
6

填充的Matrix我有成對矩陣:與換位版本

>>> m 
    a b c d 
a 1.0 NaN NaN NaN 
b 0.5 1.0 NaN NaN 
c 0.6 0.0 1.0 NaN 
d 0.5 0.4 0.3 1.0 

我想更換楠與同值的右上方在左下方:

>>> m2 
    a b c d 
a 1.0 0.5 0.6 0.5 
b 0.5 1.0 0.0 0.4 
c 0.6 0.0 1.0 0.3 
d 0.5 0.4 0.3 1.0 

我可以通過交換列和索引做到這一點:

cols = m.columns 
idxs = m.index 

for c in cols: 
    for i in idxs: 
     m[i][c] = m[c][i] 

但是,這與我的實際數據慢,而且我敢肯定有辦法做到這一點在 一步。我知道我可以用「m.T」生成右上角的版本,但我不知道如何用非NaN值替換NaN來獲得完整的矩陣。在numpy中可能有單步執行此操作的方法,但我不知道來自矩陣代數。

回答

4

如何(docs):

>>> df.combine_first(df.T) 
    a b c d 
a 1.0 0.5 0.6 0.5 
b 0.5 1.0 0.0 0.4 
c 0.6 0.0 1.0 0.3 
d 0.5 0.4 0.3 1.0 
3

這裏是一個替換的方法:

>>> m[np.triu_indices_from(m, k=1)] = m.T[np.triu_indices_from(m, k=1)] 
>>> m 
array([[ 1. , 0.5, 0.6, 0.5], 
     [ 0.5, 1. , 0. , 0.4], 
     [ 0.6, 0. , 1. , 0.3], 
     [ 0.5, 0.4, 0.3, 1. ]]) 

m[np.triu_indices_from(m, k=1)]返回上面的對角線的m的值,並將它們分配到上面的對角線的m轉置的值的值。

1

隨着numpy.isnan()

>>> m[np.isnan(m)] = m.T[np.isnan(m)] 
>>> m 
    a b c d 
a 1.0 0.5 0.6 0.5 
b 0.5 1.0 0.0 0.4 
c 0.6 0.0 1.0 0.3 
d 0.5 0.4 0.3 1.0 

或更好,具有panda.isnull()

>>> m[pd.isnull(m)] = m.T[pd.isnull(m)] 
>>> m 
    a b c d 
a 1.0 0.5 0.6 0.5 
b 0.5 1.0 0.0 0.4 
c 0.6 0.0 1.0 0.3 
d 0.5 0.4 0.3 1.0 

這是最後相當於@DSM的解決方案!