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

相关文章
相关标签/搜索