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 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
Python实现控制台进度条功能
Jan 04 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
Jun 09 Python
Python使用wget实现下载网络文件功能示例
May 31 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
pytorch实现从本地加载 .pth 格式模型
Feb 14 Python
使用python实现多维数据降维操作
Feb 24 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
Django自关联实现多级联动查询实例
May 19 Python
Python 绘制可视化折线图
Jul 22 Python
python基于opencv 实现图像时钟
Jan 04 Python
如何利用python实现Simhash算法
Jun 28 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
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
2016/11/16 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
javascript 拖动表格行实现代码
2011/05/05 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
JS button按钮实现submit按钮提交效果
2016/11/01 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
Python简单进程锁代码实例
2015/04/27 Python
Python通过select实现异步IO的方法
2015/06/04 Python
Python解析树及树的遍历
2016/02/03 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
Python之Scrapy爬虫框架安装及使用详解
2017/11/16 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
浅谈Pytorch中的torch.gather函数的含义
2019/08/18 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
全国道德模范事迹
2014/02/01 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
矛盾论读书笔记
2015/06/29 职场文书
2016见义勇为事迹材料汇总
2016/03/01 职场文书
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python