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 开发Activex组件方法
Nov 08 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 Python
Python跳出多重循环的方法示例
Jul 03 Python
Python八皇后问题解答过程详解
Jul 29 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
jupyter notebook参数化运行python方式
Apr 10 Python
Python同时迭代多个序列的方法
Jul 28 Python
10行Python代码实现Web自动化管控的示例代码
Aug 14 Python
python利用递归方法实现求集合的幂集
Sep 07 Python
Python中for后接else的语法使用
May 18 Python
Python实现PIL图像处理库绘制国际象棋棋盘
Jul 16 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 array操作10个小技巧分享
2011/06/23 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
php调用新浪短链接API的方法
2014/11/08 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
实例说明js脚本语言和php脚本语言的区别
2019/04/04 PHP
为javascript添加String.Format方法
2020/08/11 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
Spring MVC中Ajax实现二级联动的简单实例
2016/07/06 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
2017/12/27 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
2020/03/14 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
python实现FTP服务器服务的方法
2017/04/11 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
地球上最先进的胡子和头发修剪器:Bevel
2018/01/23 全球购物
计算机本科生自荐信
2013/10/15 职场文书
技校教师求职简历的自我评价
2013/10/20 职场文书
党员创先争优公开承诺书
2014/03/28 职场文书
普通党员对照检查材料
2014/08/28 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android