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发送form-data请求及拼接form-data内容的方法
Mar 05 Python
图文详解WinPE下安装Python
May 17 Python
Python正确重载运算符的方法示例详解
Aug 27 Python
Python实现对一个函数应用多个装饰器的方法示例
Feb 09 Python
TensorFlow 合并/连接数组的方法
Jul 27 Python
Pandas 按索引合并数据集的方法
Nov 15 Python
Python八皇后问题解答过程详解
Jul 29 Python
手把手教你pycharm专业版安装破解教程(linux版)
Sep 26 Python
Python中文分词库jieba,pkusegwg性能准确度比较
Feb 11 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
python中rb含义理解
Jun 18 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 23 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中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
详解Python函数作用域的LEGB顺序
2016/05/14 Python
python制作websocket服务器实例分享
2016/11/20 Python
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
在CMD命令行中运行python脚本的方法
2018/05/12 Python
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
python爬取抖音视频的实例分析
2021/01/19 Python
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
美国美妆网站:B-Glowing
2016/10/12 全球购物
新浪微博实习心得体会
2014/01/27 职场文书
户外亲子活动策划方案
2014/02/07 职场文书
《母亲的恩情》教学反思
2014/02/13 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python
DE1103使用报告
2022/04/05 无线电