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中使用item()方法遍历字典的例子
Aug 26 Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
Python设计模式之代理模式简单示例
Jan 09 Python
wxPython之解决闪烁的问题
Jan 15 Python
python实现百度语音识别api
Apr 10 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
解决Python二维数组赋值问题
Nov 28 Python
Python动态导入模块和反射机制详解
Feb 18 Python
python实现在内存中读写str和二进制数据代码
Apr 24 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
Python Django获取URL中的数据详解
Nov 01 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 session和cookie使用说明
2010/04/07 PHP
PHP实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
php判断linux下程序问题实例
2015/07/09 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
javascript静态的url如何传递
2007/05/03 Javascript
如何快速的呈现我们的网页的技巧整理
2007/07/01 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
jQuery Deferred和Promise创建响应式应用程序详细介绍
2013/03/05 Javascript
div模拟滚动条效果示例代码
2013/10/16 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
python编写暴力破解FTP密码小工具
2014/11/19 Python
详解Python中dict与set的使用
2015/08/10 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
Html5新标签datalist实现输入框与后台数据库数据的动态匹配
2017/05/18 HTML / CSS
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
工商治理实习生的自我评价分享
2014/02/20 职场文书
初中教师个人总结
2015/02/10 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
污染环境建议书
2015/09/14 职场文书
vue修饰符.capture和.self的区别
2022/04/22 Vue.js