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编程中的文件操作攻略
Oct 16 Python
python实现class对象转换成json/字典的方法
Mar 11 Python
Python多层嵌套list的递归处理方法(推荐)
Jun 08 Python
深入浅析Python中join 和 split详解(推荐)
Jun 30 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
Apr 11 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
Python实现繁?转为简体的方法示例
Dec 18 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
python机器学习实现决策树
Nov 11 Python
Python利用PyPDF2库获取PDF文件总页码实例
Apr 03 Python
Python中如何添加自定义模块
Jun 09 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 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/03/21 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
JavaScript的Cookies
2008/01/16 Javascript
Javascript this 的一些学习总结
2012/08/02 Javascript
Tab切换组件(选项卡功能)实例代码
2013/11/21 Javascript
javascript中Date()函数在各浏览器中的显示效果
2015/06/18 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
python 自动提交和抓取网页
2009/07/13 Python
CentOS中使用virtualenv搭建python3环境
2015/06/08 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
django用户登录和注销的实现方法
2018/07/16 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
利用python生成照片墙的示例代码
2020/04/09 Python
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
本科毕业生的求职信范文
2013/11/20 职场文书
中专生职业生涯规划书范文
2013/12/29 职场文书
小学社团活动总结
2014/06/27 职场文书
财务会计专业自荐书
2014/06/30 职场文书
化工专业求职信
2014/07/01 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
机关副主任个人四风问题整改措施
2014/09/26 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
英雄儿女观后感
2015/06/09 职场文书
2015年小学生暑假总结
2015/07/13 职场文书