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中将字典转换为列表的方法
Sep 21 Python
Python 闭包的使用方法
Sep 07 Python
python的继承知识点总结
Dec 10 Python
python如何实现代码检查
Jun 28 Python
简单了解python 邮件模块的使用方法
Jul 24 Python
使用Python实现画一个中国地图
Nov 23 Python
Python matplotlib可视化实例解析
Jun 01 Python
浅谈Python numpy创建空数组的问题
May 25 Python
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
Jun 11 Python
Python上下文管理器Content Manager
Jun 26 Python
Pandas-DataFrame知识点汇总
Mar 16 Python
python处理json数据文件
Apr 11 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将XML转数组过程详解
2013/11/13 PHP
php设计模式之命令模式使用示例
2014/03/02 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
express的中间件cookieParser详解
2014/12/04 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
easyui validatebox验证
2016/04/29 Javascript
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
2018/07/04 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
Python实现字符串匹配算法代码示例
2017/12/05 Python
python并发编程之线程实例解析
2017/12/27 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
python global关键字的用法详解
2019/09/05 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
利用CSS3实现进度条的两种姿势详解
2017/03/21 HTML / CSS
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
医学专业五年以上个人求职信
2013/12/03 职场文书
班班通项目实施方案
2014/02/25 职场文书
优秀班集体先进事迹材料
2014/05/28 职场文书
三问三解心得体会
2014/09/05 职场文书
辞职信模板(中英文版)
2015/02/27 职场文书
英文投诉信格式
2015/07/03 职场文书
素质拓展训练感想
2015/08/07 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
Java常用函数式接口总结
2021/06/29 Java/Android
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫
关于vue-router-link选择样式设置
2022/04/30 Vue.js