python 「雙」稀疏矩陣轉換爲最小聯通量「單」矩陣

記一次矩陣類乘操做,工具python scipy.sparse包 核心部分sparseMatrix2tuple本身寫。python

  • 需求:將兩個約10000*10000的矩陣經過「最小聯通量」處理爲一個10000*10000的矩陣。
    • 最小聯通量,見圖。
    • A = 

    • B = 

    • 矩陣A  pn1對應A01C、A01D, B矩陣A01C、A01D對應A0111,即pn1 對應A0111爲2,若是AB矩陣的全部行列對應起來就是一個新的矩陣,A的行和B的列造成的矩陣。
  • 思想:「matrix矩陣」—>"tuple三元組"—>"sparseMatrix2tuple"—>"新tuple三元組"
  • 實現:「matrix矩陣」—>"tuple三元組"—>"sparseMatrix2tuple"—>"新tuple三元組"
  • Code:(部分代碼,爲了防止我以後忘記了
  • from scipy import sparse
    import numpy as np
    import time
    
    t1 = time.time()
    
    #稀疏矩陣轉換後至關因而處理一維矩陣運算
    for u in np.unique(tuple_L.row):
    #     print('行:',u)
        temp_row = []
        L_mid_map={}
        R_mid_list=[]
        
        for i in [m for m,item in enumerate(tuple_L.row) if item==u]:# 取行中相同元素的下標
            v = tuple_L.col[i]
            if v in tuple_R.row:# 是否在右矩陣的列中
                temp_row.append(v)# 左矩陣列中元素
                L_mid_map[v] = i # v表示左矩陣的行的下標,i表示左矩陣列的值  (左矩陣列指的是col_list)
        
        R_mid_list = [n for n,item in enumerate(tuple_R.row) if item in temp_row]#  右矩陣行中元素的下標
    #     print(R_mid_list)
    
    '''此處開始由於想太多,遲遲下不了手敲代碼,想不出以何種方式記錄須要進行遍歷的數據'''
    
        for k in range(len(R_mid_list)):  
    #         print(k)
    #         print(R_mid_list[k])
            row_list.append(u) 
            col_list.append(tuple_R.col[R_mid_list[k]])
            data_list.append(min(tuple_L.data[L_mid_map.get(tuple_R.row[R_mid_list[k]])],tuple_R.data[R_mid_list[k]]))
            # L_mid_map.get(tuple_R.row[R_mid_list[k]]) 經過右矩陣的行獲取values值  
            # 進而獲得這些values值在左矩陣map中獲取下標   而後獲得data的數據值(tri-tuple)
    t2 = time.time()
    print(t2-t1)
    matrix_ovl = sparse.coo_matrix((data, (row,col)), shape=(len(df_A.index),len(df_B.columns)))
    # 經過利用coo_matrix 將本身的數據再次轉回矩陣,即單個矩陣

     

  • 在完成此代碼以前曾由於數據量少,因此直接運了矩陣進行處理,可是當數據量上來後時間消耗到了2h之久,因而開始準備優化程序,最終該代碼保證在2min內搞定,雖然當我記錄的時候已是「柳暗花明又一村」可是曾經的」山重水複疑無路「也着實讓人着急啊。app

  • 小結:工具

    • coding時要在思考與實踐之間平衡,即先實現後優化,若是一味的執着於優化結果,將停滯不前;優化

    • 找邏輯關係很重要,找準核心的關鍵部分,縷清思緒能減小不少無謂的工做。spa

    • 若是本身腦子在打轉的問題,就去找我的,試着把你要作的事情講述給他。.net

  • 最後記錄下本身熬夜寫代碼的苦逼經歷,感謝本身的努力!!!code

相關文章
相關標籤/搜索