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中使用 Selenium 实现网页截图实例
Jul 18 Python
Python深入学习之特殊方法与多范式
Aug 31 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
May 11 Python
python网络编程之文件下载实例分析
May 20 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
python区块及区块链的开发详解
Jul 03 Python
python集成开发环境配置(pycharm)
Feb 14 Python
Python列表倒序输出及其效率详解
Mar 04 Python
Python使用扩展库pywin32实现批量文档打印实例
Apr 09 Python
Python urllib.request对象案例解析
May 11 Python
Python如何输出警告信息
Jul 30 Python
Python读取pdf表格写入excel的方法
Jan 22 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使用header()输出图片缓存实例
2014/12/09 PHP
php 实现进制相互转换
2016/04/07 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
PHP生成短网址的思路以及实现方法的详解
2019/03/25 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
javascript显示动态时间的方法汇总
2018/07/06 Javascript
vue 点击按钮实现动态挂载子组件的方法
2018/09/07 Javascript
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
学习python (1)
2006/10/31 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
Python探索之修改Python搜索路径
2017/10/25 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
python3实现猜数字游戏
2020/12/07 Python
centos7中安装python3.6.4的教程
2019/12/11 Python
python元组拆包实现方法
2021/02/28 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
StubHub德国:购买和出售门票
2017/09/06 全球购物
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
维多利亚的秘密阿联酋官网:Victoria’s Secret阿联酋
2019/12/07 全球购物
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
用Java语言将一个键盘输入的数字转化成中文输出
2013/01/25 面试题
小学安全汇报材料
2014/08/14 职场文书
财务人员个人工作总结
2015/02/27 职场文书
银行反洗钱宣传活动总结
2015/05/08 职场文书
Mysql systemctl start mysqld报错的问题解决
2021/06/03 MySQL