博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python “双”稀疏矩阵转换为最小联通量“单”矩阵
阅读量:6417 次
发布时间:2019-06-23

本文共 1892 字,大约阅读时间需要 6 分钟。

hot3.png

记一次矩阵类乘操作,工具python scipy.sparse包 核心部分sparseMatrix2tuple自己写。

  • 需求:将两个约10000*10000的矩阵通过“最小联通量”处理为一个10000*10000的矩阵。
    • 最小联通量,见图。
    • A = 161708_Z5HV_1462678.png

    • B = 161748_vTap_1462678.png

    • 矩阵A  pn1对应A01C、A01D, B矩阵A01C、A01D对应A0111,即pn1 对应A0111为2,如果AB矩阵的所有行列对应起来就是一个新的矩阵,A的行和B的列形成的矩阵。
  • 思想:“matrix矩阵”—>"tuple三元组"—>"sparseMatrix2tuple"—>"新tuple三元组"
    • 这个过程中需要用到python的 scipy.sparse包。见
  • 实现:“matrix矩阵”—>"tuple三元组"—>"sparseMatrix2tuple"—>"新tuple三元组"
  • Code:(部分代码,为了防止我之后忘记了
  • from scipy import sparseimport numpy as npimport timet1 = 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内搞定,虽然当我记录的时候已经是“柳暗花明又一村”但是曾经的”山重水复疑无路“也着实让人着急啊。

  • 小结:

    • coding时要在思考与实践之间平衡,即先实现后优化,如果一味的执着于优化结果,将停滞不前;

    • 找逻辑关系很重要,找准核心的关键部分,缕清思绪能减少很多无谓的工作。

    • 如果自己脑子在打转的问题,就去找个人,试着把你要做的事情讲述给他。

  • 最后记录下自己熬夜写代码的苦逼经历,感谢自己的努力!!!

 

转载于:https://my.oschina.net/u/1462678/blog/909772

你可能感兴趣的文章
#25 centos7(RHEL)系列操作系统的启动流程、systemd的特性、与命令systemctl的使用...
查看>>
shell简介
查看>>
网络基础配置
查看>>
Java之品优购课程讲义_day12(8)
查看>>
Python多重继承用法 Python周末学习
查看>>
thinkphp自动验证中的静态验证和动态验证和批量验证
查看>>
简练软考知识点整理-软件测试之边界值分析
查看>>
Linux手工编译安装apache
查看>>
理解高性能内存缓存对象缓存Memcached原理 (Memcached核心概念,部署)
查看>>
11 个简练的 Java 性能调优技巧
查看>>
linux 下安装 talib库
查看>>
高级文件系统管理磁盘配额,RAID
查看>>
Varnish安装
查看>>
海内外加速
查看>>
【数据库】分布式数据库技术与实现
查看>>
Oracle分析表及动态采样
查看>>
[BZOJ 1492][NOI2007]货币兑换Cash(CDQ分治+斜率优化Dp)
查看>>
ajax的使用
查看>>
windows 64位系统下 apache+php+mysql
查看>>
第八课 技术小白如何在45分钟内发行通证(TOKEN)并上线交易
查看>>