Python 稀疏矩阵-sparse 存储和转换


Posted in Python onMay 27, 2017

稀疏矩阵-sparsep

from scipy import sparse

稀疏矩阵的储存形式

在科学与工程领域中求解线性模型时经常出现许多大型的矩阵,这些矩阵中大部分的元素都为0,被称为稀疏矩阵。用NumPy的ndarray数组保存这样的矩阵,将很浪费内存,由于矩阵的稀疏特性,可以通过只保存非零元素的相关信息,从而节约内存的使用。此外,针对这种特殊结构的矩阵编写运算函数,也可以提高矩阵的运算速度。

scipy.sparse库中提供了多种表示稀疏矩阵的格式,每种格式都有不同的用处,其中dok_matrix和lil_matrix适合逐渐添加元素。

dok_matrix从dict继承,它采用字典保存矩阵中不为0的元素:字典的键是一个保存元素(行,列)信息的元组,其对应的值为矩阵中位于(行,列)中的元素值。显然字典格式的稀疏矩阵很适合单个元素的添加、删除和存取操作。通常用来逐渐添加非零元素,然后转换成其它支持快速运算的格式。

a = sparse.dok_matrix((10, 5))
a[2:5, 3] = 1.0, 2.0, 3.0
print a.keys()
print a.values()
[(2, 3), (3, 3), (4, 3)]
[1.0, 2.0, 3.0]

lil_matrix使用两个列表保存非零元素。data保存每行中的非零元素,rows保存非零元素所在的列。这种格式也很适合逐个添加元素,并且能快速获取行相关的数据。

b = sparse.lil_matrix((10, 5))
b[2, 3] = 1.0
b[3, 4] = 2.0
b[3, 2] = 3.0
print b.data
print b.rows
[[] [] [1.0] [3.0, 2.0] [] [] [] [] [] []]
[[] [] [3] [2, 4] [] [] [] [] [] []]

coo_matrix采用三个数组row、col和data保存非零元素的信息。这三个数组的长度相同,row保存元素的行,col保存元素的列,data保存元素的值。coo_matrix不支持元素的存取和增删,一旦创建之后,除了将之转换成其它格式的矩阵,几乎无法对其做任何操作和矩阵运算。

coo_matrix支持重复元素,即同一行列坐标可以出现多次,当转换为其它格式的矩阵时,将对同一行列坐标对应的多个值进行求和。在下面的例子中,(2, 3)对应两个值:1和10,将其转换为ndarray数组时这两个值加在一起,所以最终矩阵中(2, 3)坐标上的值为11。

许多稀疏矩阵的数据都是采用这种格式保存在文件中的,例如某个CSV文件中可能有这样三列:“用户ID,商品ID,评价值”。采用numpy.loadtxt或pandas.read_csv将数据读入之后,可以通过coo_matrix快速将其转换成稀疏矩阵:矩阵的每行对应一位用户,每列对应一件商品,而元素值为用户对商品的评价。

row = [2, 3, 3, 2]
col = [3, 4, 2, 3]
data = [1, 2, 3, 10]
c = sparse.coo_matrix((data, (row, col)), shape=(5, 6))
print c.col, c.row, c.data
print c.toarray()
[3 4 2 3] [2 3 3 2] [ 1 2 3 10]
[[ 0 0 0 0 0 0]
 [ 0 0 0 0 0 0]
 [ 0 0 0 11 0 0]
 [ 0 0 3 0 2 0]
 [ 0 0 0 0 0 0]]

个人操作中选择,coo_matrix 选在因为涉及稀疏矩阵运算,但是如果不用其他形式存储则复杂度太高(时间和空间)1000*1000的matrix大约话2h,也是要命了。无奈想到了Pajek软件中数据的输入格式三元组:Python 稀疏矩阵-sparse 存储和转换

所以想到将自己的数据处理成类似的三元组!

即“matrix矩阵”—>"tuple三元组"—>"sparseMatrix2tuple"—>"scipy.sparse"

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python遍历zip文件输出名称时出现乱码问题的解决方法
Apr 08 Python
浅谈Python中copy()方法的使用
May 21 Python
python之cv2与图像的载入、显示和保存实例
Dec 05 Python
Python 窗体(tkinter)按钮 位置实例
Jun 13 Python
实例详解Python模块decimal
Jun 26 Python
Python实现二叉树的最小深度的两种方法
Sep 30 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
Mar 09 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
python各种excel写入方式的速度对比
Nov 10 Python
Python join()函数原理及使用方法
Nov 14 Python
python实现简易自习室座位预约系统
Jun 30 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 Python
Django基础之Model操作步骤(介绍)
May 27 #Python
python之PyMongo使用总结
May 26 #Python
Python3安装Pymongo详细步骤
May 26 #Python
Python计时相关操作详解【time,datetime】
May 26 #Python
Python表示矩阵的方法分析
May 26 #Python
Python实现中文数字转换为阿拉伯数字的方法示例
May 26 #Python
Python简单网络编程示例【客户端与服务端】
May 26 #Python
You might like
php数组比较实现查找连续数的方法
2015/07/29 PHP
零基础php编程好学吗
2019/10/11 PHP
Jquery Change与bind事件代码
2011/09/29 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
如何判断元素是否为HTMLElement元素
2013/12/06 Javascript
简单的JavaScript互斥锁分享
2014/02/02 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
2018/01/09 Javascript
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
微信小程序合法域名配置方法
2019/05/06 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
python从入门到精通(DAY 1)
2015/12/20 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
Python logging设置和logger解析
2019/08/28 Python
Django框架表单操作实例分析
2019/11/04 Python
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
公共汽车、火车和飞机票的通用在线预订和销售平台:INFOBUS
2019/11/30 全球购物
各营销点岗位职责范本
2014/03/05 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
车贷收入证明范本
2014/09/14 职场文书
甜品蛋糕店创业计划书
2014/09/21 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
饭店服务员岗位职责
2015/02/09 职场文书
值班管理制度范本
2015/08/06 职场文书
用python实现监控视频人数统计
2021/05/21 Python
Python数据分析之绘图和可视化详解
2021/06/02 Python