2016-02-24 95 views
1

我覺得自己喜歡numpy,scipy或者networkx有一個方法可以做到這一點,但我還沒有弄明白。創建非冗餘相關矩陣Python的最有效方法?

我的問題是如何創建一個非冗餘相關矩陣的DataFrame的形式從一個冗餘相關矩陣爲最大數據集在最有效的方式(在Python中)?

我使用一個7000x7000矩陣這個方法,這是對我的MacBook Air 4GB內存到永遠(我知道,我絕對不應該使用這種編程但這是另一個討論)冗餘的

例相關矩陣

enter image description here

非冗餘相關矩陣的實施例

enter image description here

我在下面做了一個非常天真的做法,但必須有更好的方法。我喜歡將矩陣存儲在稀疏矩陣中,並將它們轉換爲用於存儲目的的數據幀。

import pandas as pd 
import numpy as np 
import networkx as nx 

#Example DataFrame 
L_test = [[0.999999999999999, 
    0.374449352805868, 
    0.000347439531148995, 
    0.00103026903356954, 
    0.0011830950375467401], 
[0.374449352805868, 
    1.0, 
    1.17392596672424e-05, 
    1.49428208843456e-07, 
    1.216664263989e-06], 
[0.000347439531148995, 
    1.17392596672424e-05, 
    1.0, 
    0.17452569907144502, 
    0.238497202355299], 
[0.00103026903356954, 
    1.49428208843456e-07, 
    0.17452569907144502, 
    1.0, 
    0.7557000865939779], 
[0.0011830950375467401, 
    1.216664263989e-06, 
    0.238497202355299, 
    0.7557000865939779, 
    1.0]] 
labels = ['AF001', 'AF002', 'AF003', 'AF004', 'AF005'] 
DF_1 = pd.DataFrame(L_test,columns=labels,index=labels) 

#Create Nonredundant Similarity Matrix 
n,m = DF_test.shape #they will be the same since it's adjacency 
#Empty array to fill 
A_tmp = np.zeros((n,m)) 
#Copy part of the array 
for i in range(n): 
    for j in range(m): 
     A_tmp[i,j] = DF_test.iloc[i,j] 
     if j==i: 
      break 
#Make array sparse for storage 
A_csr = csr_matrix(A_tmp) 
#Recreate DataFrame 
DF_2 = pd.DataFrame(A_csr.todense(),columns=DF_test.columns,index=DF_test.index) 
DF_2.head() 

回答

2

我認爲你可以np.tril創建數組,然後用DataFrameDF_1多個它:

print np.tril(np.ones(DF_1.shape)) 
[[ 1. 0. 0. 0. 0.] 
[ 1. 1. 0. 0. 0.] 
[ 1. 1. 1. 0. 0.] 
[ 1. 1. 1. 1. 0.] 
[ 1. 1. 1. 1. 1.]] 

print np.tril(np.ones(DF_1.shape)) * DF_1 
      AF001   AF002  AF003 AF004 AF005 
AF001 1.000000 0.000000e+00 0.000000 0.0000  0 
AF002 0.374449 1.000000e+00 0.000000 0.0000  0 
AF003 0.000347 1.173926e-05 1.000000 0.0000  0 
AF004 0.001030 1.494282e-07 0.174526 1.0000  0 
AF005 0.001183 1.216664e-06 0.238497 0.7557  1 
+0

這正是我一直在尋找! –

+0

在不到2秒的時間內完成了 –