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中使用pprint函数进行格式化输出的教程
Apr 07 Python
Python使用pyodbc访问数据库操作方法详解
Jul 05 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 Python
Python3 SSH远程连接服务器的方法示例
Dec 29 Python
Python实现FTP弱口令扫描器的方法示例
Jan 31 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
Jul 31 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
python 输出列表元素实例(以空格/逗号为分隔符)
Dec 25 Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 Python
Python定义一个Actor任务
Jul 29 Python
Python实现淘宝秒杀功能的示例代码
Jan 19 Python
python神经网络学习 使用Keras进行回归运算
May 04 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实现的在线人员函数库
2008/04/09 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
用javascript实现自定义标签
2007/05/08 Javascript
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
移动节点的jquery代码
2014/01/13 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
使用jQuery和ajax代替iframe的方法(详解)
2017/04/12 jQuery
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
js实现简单点赞操作
2020/03/17 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
2020/08/04 Javascript
[47:45]Liquid vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
python&MongoDB爬取图书馆借阅记录
2016/02/05 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
python爬虫 正则表达式解析
2019/09/28 Python
Django之form组件自动校验数据实现
2020/01/14 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
体育学院毕业生自荐信
2013/11/03 职场文书
区域销售经理职责
2013/12/22 职场文书
机械制造专业个人的自我评价
2013/12/28 职场文书
优秀员工获奖感言
2014/03/01 职场文书
解除合同协议书
2014/04/17 职场文书
经典演讲稿汇总
2014/05/19 职场文书
篮球社团活动总结
2014/06/27 职场文书
2016年校园植树节广播稿
2015/12/17 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers