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中获取网页状态码的两个方法
Nov 03 Python
改进Django中的表单的简单方法
Jul 17 Python
详解Swift中属性的声明与作用
Jun 30 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
Apr 06 Python
python中的变量如何开辟内存
Jun 26 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
解决Python设置函数调用超时,进程卡住的问题
Aug 08 Python
Python性能分析工具Profile使用实例
Nov 19 Python
python 实现在无序数组中找到中位数方法
Mar 03 Python
python模拟斗地主发牌
Apr 22 Python
在python下实现word2vec词向量训练与加载实例
Jun 09 Python
Python openpyxl模块实现excel读写操作
Jun 30 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中的escape函数
2013/06/29 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
element-ui 表格数据时间格式化的方法
2018/08/24 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
原生js实现购物车功能
2020/09/23 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
python实现简单的购物程序代码实例
2020/03/03 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
质检员岗位职责
2013/12/17 职场文书
幼儿园数学教学反思
2014/02/02 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
班组建设经验交流材料
2014/05/12 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
运动会广播稿100字
2015/08/19 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书
TypeScript 内置高级类型编程示例
2022/09/23 Javascript